簡體   English   中英

根目錄中的新git存儲庫,用於包含子目錄中的現有存儲庫

[英]New git repository in root directory to subsume an exist repository in a sub-directory

我正在開發一個目前沒有任何版本控制的大型代碼庫(是的,真的)。 我一直在深度目錄中的一個組件上工作,並創建了一個隱蔽的git存儲庫來跟蹤我的更改。 我現在想要將所有代碼添加到源代碼控制中,並為整個目錄樹創建一個存儲庫。 我希望新的外部存儲庫包含內部存儲庫中文件的所有歷史記錄。 我不想要單獨的項目或子模塊; 我希望好像從一開始就在代碼樹的根目錄中創建了存儲庫,而內部存儲庫從未存在過。 我想刪除子目錄中的.git目錄,但不希望丟失它包含的修訂歷史記錄。

我在這個主題上閱讀的所有內容都是關於合並現有的存儲庫,這不是這里的情況,也不是關於維護子模塊或遠程項目,這是我不想要的。

謝謝。

假設您的組件位於/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

當然,您必須像平常一樣為項目的其余部分添加文件。

您可以使用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目錄移動到項目根目錄中; 你不應該看到任何未分級的文件。

我很確定使用--index-filter和git的管道命令有一種計算上更便宜的方式,但我不清楚它們。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM