2011-08-25 162 views
2

我正在處理當前不在任何版本控制下的大代碼庫(是,真的)。我一直在研究深層目錄中的一個組件,並創建了一個隱藏的git存儲庫來跟蹤我的更改。 我現在想要將所有代碼添加到源代碼管理,併爲整個目錄樹建立一個存儲庫。我希望新的外部存儲庫將文件的所有歷史記錄包含在內部存儲庫中。 我不想單獨的項目或子模塊;我想要知道存儲庫是從一開始就在代碼樹的根目錄中創建的,並且內部存儲庫從不存在。 我想刪除子目錄中的.git目錄,但不希望丟失它包含的修訂歷史記錄。根目錄中的新git存儲庫包含子目錄中的存在存儲庫

一切我都在閱讀題目是有關合並現有資源庫,在這裏還是要維持子模塊或遠程項目,我不希望出現這種情況並非如此。

謝謝。

+0

讓我看看,如果我能掀起該過濾器分支命令只是給我一分鐘 – knittl

回答

1

假設您的組件位於/project-root/deep/path/to/component。下面的命令將做你想做的:

cd /project-root/deep/path/to/component 
git filter-branch --tree-filter 'mkdir -p deep/path/to/component; git mv file1 file2 file2 deep/path/to/component' HEAD 
rm -rf deep 
mv .git /project-root 
git reset --hard 

然後,當然,你必須添加文件的項目,就像正常的休息。

+0

這正是做,正是我需要的。謝謝。 – Anthony

0

您可以使用filter-branch而在當前的歷史將現有的文件到子目錄,他們將有倉庫存在於項目的根從一開始就在:

git filter-branch \ 
--tree-filter ' 
>/dev/null mkdir -p path/from/project/root/to/current/; 
mv * path/from/project/root/to/current/; 
# take care of special files, e.g. .gitignore and other hidden files 
mv .gitignore path/from/project/root/to/current/; 
' 
--tag-filter cat \ 
--all 

此完成後,確認所產生的歷史。如果一切都很花哨,請將.git目錄移動到您的項目根目錄下;你不應該看到任何unstaged文件。

我很確定有一個計算上更便宜的方法,使用--index-filter和git的管道命令,但我不知道他們的心。

這將重寫歷史記錄,因此如果您的存儲庫由多個開發人員共享,請不要使用此方法。

相關問題