[SR-Dev] How to import modules with full history

Jan Janak jan at iptel.org
Thu Feb 19 11:23:55 CET 2009


On 19-02 03:21, Jan Janak wrote:
> But there is a solution: git-filter-branch. This is a handy git command which
> (among other things) can walk through all commits in the history of the
> current branch and tranform the commits into new commits with selected files
> only. To include only files in modules/sqlops we can do the following:
> 
>   git-filter-branch --subdirectory-filter modules/sqlops
> 
> The command rewrite the history of the current branch, your current branch
> should be sqlops_filtered if you followed this guide from the beginning. If
> you investigate the history of the branch with git log, you should see only
> commits that are related to files in modules/sqlops. (The module contained
> only one commit at the time of writing of this memo so don't be surprised if
> you only see one commit in the history).
> 
> If you examine your current working directory now, you'll notice that the
> directory contains files from modules/sqlops in the top level directory. We
> need to put them back into modules/sqlopts before we can merge the branch into
> sip-router tree, this can be done with git-filter-branch again. But before we
> can run the command second time, we need to remove some residual files from
> the previous run:
> 
>   rm -rf .git/refs/original
> 
> And the following command will move all the files back to modules/sqlops 
> subdirectory:
> 
> git-filter-branch --index-filter 'git ls-files -s |
>    sed "s-\t-&modules/sqlopt/-" | 
>    GIT_INDEX_FILE=$GIT_INDEX_FILE.new git update-index --index-info && 
>    mv $GIT_INDEX_FILE.new $GIT_INDEX_FILE' HEAD
> 
> The previous command might look a little scary, but it is documented in man
> git-filter-branch if you are interested in details.

Attached is a simple shell script which does both git-filter-branch commands
described above, I call the script git-filter-move. The script takes two
parameters, the first parameter is the directory filter. The second parameter
is the new prefix of all files that are left after the filter.

So, If I wanted to extract just the kamailio db_berkeley module and if I
wanted to prefix all files in that module with km_ to avoit conflicts with
files coming from ser, I would do:

  git co -b bdb_filtered kam/trunk
  git-filter-move modules/db_berkeley modules/db_berkeley/km_

And after this the branch is ready to be merged into other branches. Note that
if you just wanted to extract a module without giving its files km_ prefix,
you would run:
  
  git-filter-move modules/db_berkeley modules/db_berkeley/

Notice the trailing / in the second parameter, it is important in this case.

   Jan.
-------------- next part --------------
#!/usr/bin/env sh

if [ $# != 2 ] ; then
   echo "ERROR: Wrong number of parameters!"
   echo "Usage: $0 <filter_dir> <new_prefix>"
   exit 1
fi

git-filter-branch --subdirectory-filter "$1"

rm -rf .git/refs/original

git-filter-branch --index-filter "git ls-files -s | sed \"s-\t-&$2-\" | GIT_INDEX_FILE=\$GIT_INDEX_FILE.new git update-index --index-info && mv \$GIT_INDEX_FILE.new \$GIT_INDEX_FILE" HEAD





More information about the sr-dev mailing list