2010-06-17 134 views
4

這裏是我 - 我的代碼一個混帳回購協議:如何更改git歷史記錄中的文件路徑?

projects 
     |-proj1 (no git repo here yet) 
      |-subproj1 <- current git repo here 

這裏是我想要的東西 - 一個git回購這是目前跟蹤新項目,使用我的代碼:

projects 
     |-proj1 <-git repo moved to here, but still tracking files in subproj1 
      |-subproj1 (no git repo here) 

我想保持歷史記錄不變,因此新的存儲庫將引用比原始文件更深一級的文件。什麼是最痛苦的方式來做到這一點?

回答

10

重寫歷史可以與git filter-branch命令來完成。事實上,移動目錄樹成一個子目錄是在git filter-branch手冊頁給出的剪切&糊現成的例子之一:

git filter-branch --index-filter ' 
    git ls-files -s | 
    sed "s-\t\"*-&subproj1/-" | 
    GIT_INDEX_FILE=$GIT_INDEX_FILE.new git update-index --index-info && 
    mv $GIT_INDEX_FILE.new $GIT_INDEX_FILE 
' HEAD 
+1

我正在嘗試做類似的事情,並注意到我的臨時索引文件沒有寫入(https://gist.github.com/60d14f45a0b2fb98e641)。會有什麼合理的理由說明臨時指數沒有被寫入? – 2010-09-06 05:41:19

+1

sed命令似乎是flakey;我沒有得到預期的結果。 – mxcl 2011-10-11 16:53:32

+1

我也遇到了sed命令的問題。作爲分隔符的'-'是不常見的,並且對名稱中帶有連字符的目錄不可用。我使用:'sed「s#\ t \」*#&sub-proj1 /#「' – 2014-12-08 10:19:24

-1

只需在回購庫中創建所需的目錄結構 - 即將所有文件和文件夾移動到「subproj1」文件夾。

則階段所有的添加和刪除文件,git會制定出它們實際上是重命名:

git add . 
git add -u . 
git commit -m "Moved to a subfolder" 
+1

這將意味着,如果我籤之前提交,文件將被內簽出proj1。我不想那樣。我希望能夠檢出以前的提交,並讓subproj1中的文件受到影響。 – Carl 2010-06-17 02:55:42

相關問題