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

标签 git

我想重写历史记录,并将某个文件夹中的所有文件和文件夹移动到所有分支的 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

但是,当我想将此命令与重写历史命令一起使用时,它不起作用。

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

最佳答案

过滤器命令不需要是 git 命令。难道就这么简单吗?

git filter-branch --force --tree-filter 'mv src/src/files src/; mv src/src/文件夹 src/'

关于Git 重写历史记录将文件夹和文件移动到父文件夹,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16450423/

相关文章:

git - 从提交中恢复特定文件

Git 将一个包含所有子模块的 repo 镜像到另一个 repo

git - 如何在 Dockerfile 中本地安装 pip 包?

reactjs - 世博会初始化不需要的 git repo

git - 如何正确配置涉及 github 和 bitbucket 的多个远程帐户的 ssh key ?

gitosis 授权 key

git - 在 git 中显示提交者日期而不是作者日期

git - 是否可以使用礼品库查看远程仓库的所有分支?

git - 强制 git 运行接收后 Hook ,即使一切都是 "up-to-date"

git - 您应从提交中排除Firefox配置文件的哪些文件夹/文件?