2012-11-12 41 views
4

使用git filter-branch --subdirectory-filter您可以將當前存儲庫中的子目錄自行轉換爲存儲庫。然而,我想要做的卻是相反的事情:創建一個存儲庫,將當前存儲庫的全部內容作爲子目錄存放,保存完整的歷史記錄,就好像它們總是在該子目錄中一樣。我不想使用子模塊,因爲我希望該目錄成爲存儲庫的完整組成部分。`git filter-branch --subdirectory-filter`的反義詞是什麼?


背景:我用寫一個簡單的腳本任務,但是任務的範圍也不斷擴大,所以現在該腳本變成只是在一個大項目的子目錄。它本身也沒有生存點,所以沒有子模塊的解決方案是首選。

回答

8

最簡單的辦法是不理歷史:只需git mv所有的文件到一個子目錄,提交這一變化,並用自己的生命矣。

如果你真的想裝,如果你一直在做一個子目錄這項工作中,最不復雜的方法是使用類似:

git filter-branch --tree-filter "mkdir SUBDIR && bash -c 'git mv -k {,.[!.],..[!.]}* SUBDIR/'" 

與目標子目錄的名稱替換SUBDIR。

+0

詹姆,謝謝,這只是事情:)至於在命令行中,它的工作方式幾乎罰款,但可惜的是跳過隱藏的文件。我發現[解決方案正確地將它們放在一起](http://serverfault.com/a/122343),這也不能用於開箱即用。不幸的是,這似乎需要明確運行'bash'(git默認使用'sh'?)。所以我建議編輯你的答案,這會使代碼膨脹一點,但也適用於隱藏文件。 – Septagram

+0

編輯對我來說很有意義!我敢打賭你是對的,'git filter-branch'明確調用'sh'來運行給定的命令。 –

+0

「bash -c」部分不是必須的.​​.....而且你必須手動移動忽略的文件。順便說一句。由我.gitignore已被移動... – inf3rno

2

你可以只子項目庫中的文件移動到你想有他們在更大的存儲庫中,然後這些提交合併到最終處置庫的目錄。這將完全保留兩個存儲庫的歷史記錄,包括所有提交ID。

cd /path/to/subproject 
mkdir subproject_dir 
git mv file1 dir2 dir3... subproject_dir 
git commit 
cd /path/to/main_project 
git pull /path/to/subproject 
1

使用git subtree命令:

這可以通過類似的命令來完成。假設您有新的回購協議:

$ cd $ROOT_OF_NEW_REPO 
$ git subtree add --prefix=subdirectory/for/old/repo <old git repo URL or checkout> <commit ref> 

例如。

$ git subtree add --prefix=history ~/repos/oldrepo HEAD 

history目錄將包含oldrepo文件在HEAD承諾,所有的歷史一起。

相關問題