Git:Changing Project Licensing
==============================
:author: Aaron Ball
:email: nullspoon@iohq.net



I'm unsure about the legality of doing something like this. I think though that
this probably shouldn't be used if you've already released your project. If
however you have not yet released and have changed your mind to use a different
license prior to its release, this may be just the post for you.

I recently was working on a project that prior to releasing, I decided upon
using the Apache V2 license. After something thinking though (and about 10
commits), I decided I wanted to release this project under the copyleft
http://www.gnu.org/licenses/gpl-2.0.html[GPL v2] license.  Unfortunately
though, I had already commited the LICENSE file as well as put the shortened
license header at the top of my program's files.  Thankfully, git has a
solution to fix this problem. However, we will have to fix this in two steps
since we will be rewriting a certain file as well as deleting another entirely
(LICENSE).

[[removing-a-file-section-throughout-history]]
== Removing a File Section Throughout History

----
git filter-branch -f --tree-filter "if link:\$(grep_'Apache'_somefile)[\$(grep 'Apache' somefile)]; then sed -i -e '2,16d' somefile; fi"
----

What this does is modify the contents of file **somefile**. Effectively, for
each commit in history (+git filter-branch --tree-filter+), this checks if the
file *somefile* contains the string __Apache__. If it does, it then uses sed to
do an inline edit to delete lines 2-16 (those are the lines containing my
license header).  You will likely need to change those since not all license
headers are the same length (and don't start at line 2).

[[deleting-a-file-from-history]]
== Deleting a File From History

Now that we've cleaned out the license header, we just need to remove the
LICENSE file from all of history so we can put a new one in. To do this, we're
going to use the *--index-filter* switch.

----
git filter-branch -f --index-filter 'git rm --cached --ignore-unmatch ./LICENSE'
----

Something to note about the _git rm_ command we just ran. Notice the
_--ignore-unmatch_ switch. That will make git rm return a 0 status even if the
specified file is not found. Basically, that means that it will keep the git
filter-branch command from exiting when it happens upon a commit where the file
doesn't currently exist.



Category:Git


// vim: set syntax=asciidoc:
