2013-07-01 195 views
4

我有很多提交/分支的長期(〜2年)回購,現在由於某些原因,我需要將存儲庫的根文件夾更改爲上面的一個文件夾。GIT更改基礎/根文件夾

一些例子來澄清這個概念。

我有一個文件夾中存儲庫:

c:\workspace\test\src\ 

所以在我的回購在上述一個的文件/子文件夾的所有變化。

我想倉庫移至:

c:\workspace\test 

是從現在開始,可以添加在測試文件夾mantaining老倉庫的歷史所有的變化..

因此,所有的老提交被標記在文件夾"\",現在應該在文件夾"\src"

檢查舊提交我能或不能有(它其實並不重要)文件夾的實際內容..

是否有可能?

我希望我解釋是可以理解的..

回答

0

如果我理解正確的話你的問題,如果你從一個乾淨的git倉庫啓動(git status說:「沒有什麼承諾,工作目錄清潔」),你只需要將.git目錄從c:\workspace\test\src\移至c:\workspace\test\

然後,您必須對新佈局中的所有文件執行「大」提交。 Git將把這個新的提交視爲一個重大舉措。不需要新的內容,因爲文件是相同的。 Git只會在他的.git目錄中註冊新的樹型佈局(使用src)。


重讀這個問題讓我覺得你可能希望有可用的舊提交的src子目錄

如果是這樣的話,你需要使用的東西完全重寫你的Git倉庫的歷史一樣git filter-branch --tree-filter '...'

+0

如果可能我不希望有一個新的'大'承諾,但更改在舊的根文件夾'\'與新的'\ src' ..但我不知道是否有可能 – Marcx

+0

謝謝你爲你的編輯,這就是我想要的,我會稍後嘗試,如果它的工作... – Marcx

+0

我試過,但沒有運氣,你能告訴我一個我需要使用的命令的詳細示例?謝謝.. – Marcx

0

聽起來像是你應該只需要做到這一點:

  1. 命名c:\workspace\test\srcc:\workspace\src
  2. 刪除目錄c:\workspace\test,這大概是現在空
  3. 重命名c:\workspace\srcc:\workspace\test

git倉庫不一般保持它們的父目錄的軌道,所以從一個地方移動在倉庫到另一個應該是無害的。現在,無論腳本/構建文件/存儲庫中可能包含硬編碼路徑的任何內容都可能是完全不同的故事......

+0

不,我需要測試目錄,並在測試目錄中有一些文件,從現在開始應該包含在git倉庫中... – Marcx

2

我認爲您的意思是您的回購頂級目錄是c:\workspace\test\,並且您希望c:\workspace\test\src\成爲新的頂級目錄。首先,檢查是這種情況:

cd c:\workspace\test\src 
git rev-parse --show-toplevel #print repo top-level directory 

應該打印出類似這樣c:\workspace\test\如果這是真的是你的頂級目錄。

如果是,您可以使用git filter-branch重新綁定命令使'src'目錄成爲新的頂層。請小心,這是你真正想要做的,因爲它會破壞性地修改你的舊歷史!任何影響該分支的提交將被重新設置爲包含src文件夾作爲新的頂層。首先備份當前分支。

cd c:\workspace\test\ 
git branch oldRoot #this backs up your current branch to a new branch called "oldRoot"  
git filter-branch --subdirectory-filter src HEAD #this modifies your history 

警告!需要注意的是:

  1. 新的歷史不會乾淨的應用,如果你有你的更改備份到遠程,你將需要:
    1. 開始使用新的遠程分支(更安全),或:
    2. 執行強制推送以覆蓋遠程歷史記錄。
  2. 如果其他人與你合作購買這個回購商品,他們可能會遇到一堆麻煩。確保他們在第一個合併他們的更改合併,因爲他們將很難在您進行重新綁定後合併它們。

欲瞭解更多信息,請閱讀Git Book中的「Making a Subdirectory the New Root」和「The Perils of Rebasing」部分。

0
git filter-branch --index-filter ' 
    git read-tree $(printf "040000 tree %s\tsrc\n" `git rev-parse HEAD:` | git mktree) 
    ' -- --branches --tags 
mv .git .. 
cd .. 

不要在這些命令中看到文檔;用法非常簡單。 filter-branch's docs關於如何使它在tmpfs上工作的建議在兩年的歷史中可能值得處理。

您可能想要grep -ri c.workspace.test .git檢查配置中的絕對路徑等,以驗證它們仍然有效。

0

首先,克隆你的回購,以便你可以孤立地處理它,並保證你的原始文件完好無損,以防出現任何問題。

git clone --no-hardlinks c:\workspace\test\src c:\sandbox 

編寫一個腳本,可以在任何單個提交時進行相應的更改。我不熟悉Windows的腳本,但你會希望你的腳本來創建一個名爲src新的子目錄(c:\sandbox\src),然後移動以外的所有.git目錄和任何.git*文件(例如,.gitignore)成那個新的子目錄。確保腳本在回購中的任何提交時都能正常工作,而不僅僅是在當前狀態下。然後運行:

git filter-branch --tree-filter c:\absolute\path\to\your\script 

這將導致混帳籤的回購每一次提交,運行腳本,然後替換最終結果提交。接下來,如果您有任何被忽略或未提交的文件,您需要將它們複製到新回購庫中的相應位置。檢查以確保過濾器分支具有預期的效果,並且新回購看起來如何您想要。一旦確定自己滿意,請刪除c:\workspace\test,然後將c:\sandbox移動到c:\workspace\test

我喜歡使用--tree-filter,如此處所示,而不是--index-filter。效率不高(因爲它必須檢查每個提交而不是直接編輯索引),但我覺得它更直觀。如果需要,它還將允許您更改回購中的文件內容(可能更新絕對路徑)。