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

Git重写历史记录将文件夹和文件向上移动到父文件夹,git,Git,我想重写历史记录,并将某个文件夹中的所有文件和文件夹向上移动到所有分支的2个文件夹中 我的回购协议看起来像: src v105 src 档案 文件夹 工具 解放党 我希望它是: src 档案 文件夹 工具 解放党 我知道如何重写历史,以递归方式删除文件夹中的文件 git筛选器分支--强制--索引筛选器'git rm-rf--缓存--忽略不匹配的somefolder/somefolder' --删减空--标记名筛选器cat--all 我还知道gitmv命令 使用以下命令,文

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

我的回购协议看起来像:

  • src
    • v105
    • src
      • 档案
      • 文件夹
  • 工具
  • 解放党
我希望它是:

  • src
    • 档案
    • 文件夹
  • 工具
  • 解放党
我知道如何重写历史,以递归方式删除文件夹中的文件


git筛选器分支--强制--索引筛选器'git rm-rf--缓存--忽略不匹配的somefolder/somefolder'
--删减空--标记名筛选器cat--all

我还知道
gitmv
命令

使用以下命令,文件和文件夹将全部移动到正确的文件夹。第一个模式匹配所提供文件夹中的所有文件和文件夹。第二种模式匹配以点开头的所有文件和文件夹

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

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


git筛选器分支--强制--索引筛选器'git mv src/v105/src/*src/v105/src/[^.]*src--缓存--忽略不匹配'
--删减空--标记名筛选器cat--all

因为src文件夹并非在我的提交历史记录中的所有情况下都存在,它告诉我它找不到src dir。有什么办法解决这个问题吗

更新


git筛选器分支--强制--索引筛选器'if[-d'src/v105/'],然后git mv src/v105/src/*src/v105/src/[^.]*src-fi'
--删减空--标记名筛选器cat--all

导致意外的文件结尾。

筛选命令不需要是git命令。能这么简单吗

git过滤器分支--force--tree过滤器'mv src/src/files src/;mv src/src/folders src/'

关于“意外的文件结尾”错误,我认为您忘记了在每条语句后添加分号
git过滤器分支
应该可以工作

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

这应该行得通!

为什么需要重写历史记录?在任何情况下,你不能复制文件,然后调用筛选器分支删除旧位置吗?因为我正在清理repo。我希望它变小,所以我不希望我的清理操作成为新的提交。你尝试过(为了安全起见,在repo的克隆上)了吗?它对我来说很有效,尽管它看起来不像这里的第三个示例那么可靠:-您可以在两个过程中运行它:
git filter branch--tree filter'test-d src/src/files&&mv src/src/files.| echo“没事做”'HEAD
,然后再次将文件更改为文件夹。我只是手动让它工作,更新了我的问题…我需要--index过滤器和--prune empty--tag name过滤器cat----所有这些都是因为我想在所有分支上执行它