2013-05-08 64 views
1

我想重寫歷史記錄並將某個文件夾中的所有文件和文件夾移動到所有分支的2個文件夾中。Git重寫歷史記錄將文件夾和文件移動到父文件夾

我的回購協議是這樣的:

  • SRC
    • V105
    • SRC
      • 文件
      • 文件夾
  • 個工具
  • LIB

我希望它是:

  • SRC
    • 文件
    • 文件夾
  • 工具
  • LIB

我知道如何改寫歷史的文件夾

git filter-branch --force --index-filter 'git rm -rf --cached --ignore-unmatched somefolder/somefolder' --prune-empty --tag-name-filter cat -- --all

我也知道git mv命令遞歸地刪除文件。

使用以下命令將文件和文件夾全部移動到正確的文件夾。第一個模式匹配提供的文件夾內的所有文件和文件夾。第二種模式匹配以點開頭的所有文件和文件夾。

git mv src/v105/src/* src/v105/src/.[^.]* src

然而,當我想用​​這個命令重寫歷史命令它不工作。

git filter-branch --force --index-filter 'git mv src/v105/src/* src/v105/src/.[^.]* src --cached --ignore-unmatched' --prune-empty --tag-name-filter cat -- --all

由於src文件夾不會在所有情況下,我犯下的歷史存在,它告訴我它無法找到在src目錄。任何想法如何解決這個問題?

UPDATE

git filter-branch --force --index-filter 'if [-d 'src/v105/'] then git mv src/v105/src/* src/v105/src/.[^.]* src fi' --prune-empty --tag-name-filter cat -- --all 導致意外的文件結束。

+0

爲什麼您需要重寫歷史記錄?在任何情況下,你不能只複製文件,然後調用filter-branch刪除舊的位置? – adamdunson 2013-05-08 21:46:21

+0

因爲我正在清理回購。我希望它變小,所以我不希望我的清理操作成爲新的提交。 – 2013-05-09 09:04:12

回答

2

過濾命令不需要是git命令。它可以像這樣簡單嗎?

git filter-branch --force -tree-filter 'mv src/src/files src/; mv src/src/folders src/'

+0

不,因爲這不會更新我的承諾,我相信... – 2013-05-09 09:02:23

+0

你試過了(爲了安全起見,你的repo的克隆)?它對我很有效,雖然它看起來不像第三個例子那樣紮實:http://stackoverflow.com/a/3142821/955926 - 你可以通過兩遍來運行它:'git filter-branch --tree-過濾'test -d src/src/files && mv src/src/files。 ||回聲「無所事事」'HEAD',然後再次將文件更改爲文件夾。 – 2013-05-09 11:29:59

+0

我只是手動工作,更新了我的問題...我需要--index-filter和--prune-empty --tag-name-filter cat - - 因爲我想在所有分支上執行此操作 – 2013-05-09 11:43:43

相關問題