2012-05-09 85 views
36

我試圖從一個倉庫移到一個單獨的文件(稱爲foo.txt的)到另一個(無關)資料庫,保留它的歷史。 ebneter's question顯示瞭如何爲子目錄執行此操作。 taw's question有一些提示和建議,但不是一步一步的過程。 jkeating's question看起來很有希望,但沒有爲我工作。谷歌搜索在這個特定用例中空了。我正在尋找的是一個明確的命令序列來完成這一點。如何將文件從一個git倉庫轉移到另一個,同時保留歷史

命令我開始跟着順序是這樣的:

$ git clone source-repo/ source-repo-copy 
$ cd source-repo-copy 
$ git filter-branch --tree-filter 'test ! "[email protected]" = "foo.txt" && \ 
    git rm --cached --ignore-unmatch [email protected] || true' --prune-empty 

我的過濾器命令的邏輯是git rm未foo.txt的所有文件。我在命令中添加了|| true以強制它具有零返回值以滿足過濾器分支。

我的目的是設定源回購副本作爲我的目標倉庫(目標回購)的遠程,並假設git filter-branch過濾掉一切,但foo.txt的,取與合併來源回購複製到目標回購。不幸的是,git filter-branch命令似乎沒有效果。它跑了沒有錯誤,似乎研磨通過600多個源回購承諾,但是當它完成後,git log和文件源回購副本看起來都一樣。不應該所有的文件,但foo.txt丟失,並沒有觸及它的所有提交從日誌中消失?

在這一點上,我不知道如何着手。有什麼建議麼?

+2

可能的重複[如何將文件從一個git回購到另一個(而不是克隆),保留歷史](http://stackoverflow.com/questions/1365541/how-to-move-files-from-one -git-repo-to-another-not-a-clone-preserving-history) – tripleee

回答

31

這爲我工作,而是與整個目錄。

如圖here

~$ cd neu 
~/neu$ git filter-branch --subdirectory-filter FooBar HEAD 
~/neu$ git reset --hard 
~/neu$ git remote rm origin 
~/neu$ rm -r .git/refs/original/ 
~/neu$ git reflog expire --expire=now --all 
~/neu$ git gc --aggressive 
~/neu$ git prune 
~/neu$ git remote add origin git://github.com/FooBar/neu.git 

編輯:對於單一的文件:

過濾器的目錄第一:

git filter-branch --prune-empty --subdirectory-filter myDirectory -- --all 

過濾器的單個文件:

git filter-branch -f --prune-empty --index-filter "git rm --cached --ignore-unmatch $(git ls-files | grep -v 'keepthisfile.txt')" 

做一些清理:

git reset --hard 
git gc --aggressive 
git prune 

這應該這樣做。

+1

是的,'--subdirectory-filter'的例子看起來很簡單,但我希望移動一個文件,而不是一個子目錄。有什麼想法呢? –

+0

請先在testrepo上試試,新的解決方案適用於我 – blang

+1

我按照您的建議過濾了目錄,使用'。'。而不是'myDirectory'。我在目錄中留下了零個文件(只是.git)。 'git log'只顯示合併提交(其中12個)。然後我過濾了單個文件。我得到了錯誤,因爲'git rm'被一個空的參數列表調用。我加了'||真正「到命令的末尾,以防止git rm的投訴中止過濾器。之後,仍然是零文件,並且只有4個合併提交'git log'。我完成了'git reset/gc/prune',但沒有看到任何改變。我想這不起作用。 :(我很高興,我想這在測試回購。:) –

0

請參閱我的回答對有關移動文件夾類似的問題,我也回答如何移動一個文件。 https://stackoverflow.com/a/24693985/464618

我想在這裏複製它,但它似乎是不允許的,因爲它已被刪除。

+3

系統不會允許您發佈相同的字面解釋兩次。您可能需要在此重新輸入您的答案才能在此處發佈。但也許,最好將問題標記爲重複。 –

相關問題