2010-11-22 64 views
5

我一直在我的計算機上爲項目「MyProject」愉快地使用git。 MyProject實際上是一個更大的合作研究工作「WholeThing」的一部分。 myProject和WholeThing中的其他項目之間幾乎沒有重疊。將本地git存儲庫遷移到更大的遠程存儲庫,同時重寫路徑

現在,大老闆決定把所有的開發放到一箇中央的git倉庫(用於文檔和備份)。目前爲止對我有意義。

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

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

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


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

如何獲取我的本地庫到在中央存儲庫中的適當的子目錄,同時保留歷史和分支機構?

我(認爲我;)瞭解遠程分支和東西,但我還沒有想出一種方法來將MyProject文件的路徑與「WholeThing/Area2」前綴移動到本地存儲庫中的文件並創建一個在推送前提交。肯定有另一種方式?

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

歡迎任何想法!

乾杯,何塞

回答

3

感謝迄今爲止的回覆......讓我在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 

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

乾杯&謝謝!

0

理想情況下,你應該在Wholething /區域2你自己的子項目MyProject.git。

如果你的老闆只想爲每個項目只有一個git倉庫,這是沒有意義的,但如果他們想要它,那就意味着WholeThing樹是一個完全不同於你的新樹,你除了拉動整個事物之外,不能做任何事情,添加你的目錄並推送一切(以及DudesProject)(你不能在git樹的子集或子目錄上工作)。無論如何,因爲這將是2種不同的樹木,你會失去所有的歷史和東西。

做東西的正確方法是每個項目都有一個git樹,所以在WholeThing下沒有.git。使用正確的方法當您添加遠程分支時,「WholeThing/Area2」會自動顯示在URL中。

1

是下一步是好的和簡單

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

,你應該是好去

相關問題