2013-05-08 33 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

相关问题