Add note on merging a single file from a foreign repo using Git.
authorW. Trevor King <wking@drexel.edu>
Thu, 15 Mar 2012 18:59:55 +0000 (14:59 -0400)
committerW. Trevor King <wking@drexel.edu>
Thu, 15 Mar 2012 19:04:30 +0000 (15:04 -0400)
posts/Git/notes.org

index 702b158970f8495571f89fa73d65d5239f5ae039..ab5a547567176eb7a9a7780f3e27313f07da0bc3 100644 (file)
@@ -486,6 +486,36 @@ Discarding all other history
 
     : $ git filter-branch --subdirectory-filter foodir -- --all
 
+** Merge a single file (with history) into another repository
+
+Merge the file =myfile= (with history) from =REPO_A= into =REPO_B=.
+
+Create a filtered version of =REPO_A=:
+
+    : $ git clone REPO_A work-a
+    : $ cd work-a
+    : $ SPELL='git ls-tree -r --name-only --full-tree "$GIT_COMMIT" | grep -v "[.]git/\|myfile" | grep -v "^[.]git\$" | tr "\n" "\0" | xargs -0 git rm --cached -r --ignore-unmatch'
+    : $ git filter-branch --prune-empty --index-filter "$SPELL" -- --all
+
+Alter the =grep= stuff as you need.  The goal is to remove anything
+you want to keep from the listing produced by =SPELL=.
+
+Merge it into =REPO_B=:
+
+    : $ cd ..
+    : $ git clone REPO_B work-b
+    : $ git remote add myfile-repo ../work-a
+    : $ git pull myfile-repo master
+    : $ git remote rm myfile-repo
+
+Clean up:
+
+    : $ cd ..
+    : $ rm -rf work-a REPO_B
+    : $ mv work-b REPO_B
+
+Thanks to [[http://gbayer.com/development/moving-files-from-one-git-repository-to-another-preserving-history/][Greg Bayer]] and [[http://stackoverflow.com/questions/7375528/how-to-extract-one-file-with-commit-history-from-a-git-repo-with-index-filter][Peter Hillerström]].
+
 ** Cherry pick a commit from another repository
 
 First, give the remote repository a nickname (optional)