2

我想重写历史并将某个文件夹 2 文件夹中的所有文件和文件夹移动到所有分支。

我的回购看起来像:

  • 源代码
    • v105
    • 源代码
      • 文件
      • 文件夹
  • 工具

我希望它是:

  • 源代码
    • 文件
    • 文件夹
  • 工具

我知道如何重写历史记录以递归地删除文件夹中的文件

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

4

2 回答 2

3

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

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

于 2013-05-08T22:09:12.820 回答
0

关于“文件意外结束”错误,我认为您忘记在每个语句后添加分号。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。这很容易通过在[表达式中添加适当的空格来解决。

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

那应该行得通!

于 2018-12-18T21:37:04.647 回答