重写git历史记录以将仓库存储在新的顶级目录中

如何重写历史记录,使根目录下的提交出现在新的子目录下?

original: foo/bar.txt
desired: newsubdir/foo/bar.txt

我正在尝试从存储库中拆分目录并将其导入到另一个目录,但是根目录上的冲突是一个问题(请参见Splitting a subfolder out into a new repository

当我过滤所需的子目录时,它会以其README.md和.gitingnore成为根目录,当我尝试将其作为子目录移植到现有存储库时会引起许多冲突。

git filter-branch --prune-empty --subdirectory-filter  foo --
result:  history of /foo stored as /

所以,我想找到一种方法:

  • 在/ foo之外过滤所有提交数据,因此我在源代码仓库中只剩下/ foo
  • 带有子目录filter和新前缀的filter-branch

有人能做到这一点,以使新仓库在新目录之外的历史记录为零吗?

wcr997 回答:重写git历史记录以将仓库存储在新的顶级目录中

修剪后,可以使用索引过滤器将其转换为新的子目录

有关示例,请参见git documentation: git-filter-branch

要将整个树移到子目录,或从那里删除它:

git filter-branch --index-filter \
    'git ls-files -s | sed "s-\t\"*-&newsubdir/-" |
        GIT_INDEX_FILE=$GIT_INDEX_FILE.new \
            git update-index --index-info &&
     mv "$GIT_INDEX_FILE.new" "$GIT_INDEX_FILE"' HEAD

仅供参考,某些sed exe文件(尤其是macOS)不会使用\ t作为标签,而可以使用粘贴的标签字符

本文链接:https://www.f2er.com/3149265.html

大家都在问