Git重写历史记录将文件夹和文件移动到父文件夹

时间:2013-05-08 21:21:14

标签: 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

但是,当我想将此命令与rewrite history命令一起使用时,它不起作用。

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目录。任何想法如何解决这个问题?

更新

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  导致意外的文件结束。

2 个答案:

答案 0 :(得分:2)

过滤器命令不需要是git命令。它可以这么简单吗?

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

答案 1 :(得分:0)

关于“意外的文件结尾”错误,我认为您忘了在每个语句后添加分号。 SELECT * FROM T TT WHERE CASE WHEN EXISTS(SELECT 1 FROM T WHERE OrderID = TT.OrderID AND Stage = 'step 1') AND EXISTS(SELECT 1 FROM T WHERE OrderID = TT.OrderID AND Stage = 'step 3') AND NOT EXISTS (SELECT 1 FROM T WHERE OrderID = TT.OrderID AND Stage = 'step 2') THEN 1 END = 1; 应该可以正常工作。

git-filter-branch

但是,您将开始看到错误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 。通过在[-d: command not found表达式内添加适当的空格,可以轻松解决此问题。

[

那应该可行!