Replace 'cp' with 'git clone'
[git-cheat-sheet.git] / README.md
index 91c2766..3dbce00 100644 (file)
--- a/README.md
+++ b/README.md
@@ -2,3 +2,53 @@ git-cheat-sheet
 ===============
 
 How to do stuff with git
+
+
+Splitting a repo
+----------------
+
+##### Remove history of all but select files in cloned repo
+```sh
+$ git clone old new
+$ cd new
+$ git clean -dfx
+$ git gc --aggressive --prune=now
+$ git remote rm origin
+$ git filter-branch \
+    --prune-empty \
+    --index-filter '
+        git ls-tree -r --name-only HEAD \
+        | grep -v file_i_want_to_keep_1 \
+        | grep -v file_i_want_to_keep_.. \
+        | grep -v file_i_want_to_keep_n \
+        | xargs git rm --cached -r --ignore-unmatch
+    ' \
+    HEAD
+$ git gc --aggressive --prune=now
+```
+
+##### Remove history of previously-removed (not in current tree) files
+```sh
+$ git log --pretty=format: --name-status \
+    | awk '$0 != "" {print $2}' \
+    | sort -u > /tmp/tree.old
+$ git ls-tree -r --name-only HEAD > /tmp/tree.new
+$ git filter-branch \
+    --prune-empty \
+    --index-filter '
+        grep -Fvxf /tmp/tree.new /tmp/tree.old \
+        | xargs git rm --cached -r --ignore-unmatch
+    ' \
+    HEAD
+```
+
+
+Inserting a new root commit
+---------------------------
+```sh
+git checkout --orphan $TEMP_BRANCH
+git rm -rf .
+git commit --allow-empty -m $INIT_COMMIT_MSG
+git rebase --onto $TEMP_BRANCH --root $MAIN_BRANCH
+git branch -d $TEMP_BRANCH
+```
This page took 0.024357 seconds and 4 git commands to generate.