簡體   English   中英

在重寫路徑時將本地git存儲庫遷移到更大的遠程存儲庫

[英]Migrating local git repository into larger remote repository while rewriting paths

我一直很樂意在我的機器上使用git作為項目“MyProject”。 MyProject實際上是更大的合作研究工作“WholeThing”的一部分。 在WholeThing中,myProject和OtherProjects之間幾乎沒有重疊。

現在,Big Bosses決定將所有開發都放在一個中央git存儲庫(用於文檔和備份)。 到目前為止對我有意義。

假設我沒有訪問中央存儲庫的特權。

問題是,MyProject映射到WholeThing的子目錄,即

local repo:
MyProject -|
           |- .git
           |
           |- dirs


remote repo:
WholeThing -|
            |- .git
            |
            |- Area1
            |
            |- Area2
                 |------ MyProject
                 |------ DudesProject

如何在保留歷史記錄和分支的同時將本地存儲庫放入中央存儲庫中的正確子目錄中?

我(想想我;)了解遠程分支和東西,但我還沒有找到一種方法來為MyProject文件的路徑添加前綴“WholeThing / Area2”,而不是移動本地存儲庫中的文件並在推送之前創建提交。 肯定還有另一種方式嗎?

我也不介意克隆WholeThing並在完成所有遷移后導航到MyProject ...所以我不是在尋找子模塊等(並且我沒有對中央存儲庫的管理訪問權限)。

歡迎任何想法!

干杯,何塞

感謝您到目前為止的回復...讓我在Google上以不同的方式提出問題。

答案實際上寫在手冊頁中,你只需要閱讀到最后。

解決方案是使用git filter-branch重寫歷史記錄,並在執行此操作時重寫每個文件的路徑。 重寫路徑原則上可以使用--tree-filter (我認為),或使用--index-filter ,這要快得多。

下面的代碼片段是從手冊頁git help filter-branch逐字逐句,只是編輯以反映我的示例中的目錄。 它要求每個提交所涉及文件的路徑名,重寫它們前綴為“WholeThing / Area2 / MyProject /”並重放提交。

git filter-branch --index-filter \
    'git ls-files -s | sed "s-\t-&WholeThing/Area2/MyProject/-" |
     GIT_INDEX_FILE=$GIT_INDEX_FILE.new \
     git update-index --index-info &&
     mv $GIT_INDEX_FILE.new $GIT_INDEX_FILE' HEAD

下一個(希望很簡單)步驟是添加遠程存儲庫並推送到它。

干杯謝謝!

是的,下一步很簡單

git remote add other [path/to/repo]
git fetch other
git checkout -b other-master other/master
git checkout master
git merge other-master

你應該好好去

理想情況下,您應該在Wholething / Area2下擁有自己的子項目MyProject.git。

如果你的老板想要為每個項目只有一個git存儲庫,這沒有意義,但是如果他們仍然想要它,那就意味着WholeThing樹是一個完全不同於你的新樹,你不能這樣做除了拉動整個東西,添加你的目錄並推送所有東西(以及DudesProject)(你不能在git樹的子集或子目錄上工作)。 無論如何,那將是2棵不同的樹,你將失去所有的歷史和東西。

做事的正確方法是每個項目都有一個git樹,所以在WholeThing下沒有.git。 使用正確的方法,當您添加遠程分支時,“WholeThing / Area2”在URL中自然出現。

暫無
暫無

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

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