将git仓库中的一组文件拆分到他们自己的存储库中,保留相关历史记录

jke*_*ing 36 git git-filter-branch

可能重复:
如何在保留子目录的同时拆分git存储库?

有一次,我将我的代码添加到现有的git repo中,并且已经承诺了很多,因为其他开发人员已经提交到repo中的其他现有文件. 现在我想将我的代码拆分为自己的repo,但保留我的特定文件的所有更改历史记录.

通过阅读其他人为分割代码所做的工作,我正在查看filter-branch和执行--index-filter--tree-filter使用rm命令来查找我不关心的文件.我不想使用,--subdirectory-filter因为它不适合将我的代码保存为topdir的子目录(我们也共享一个子目录).更复杂的是,原始存储库中的一些文件随着时间的推移已经移动了一些,并且有一些文件被创建然后被删除.这使得设计一个rm列表有点......具有挑战性.

我正在寻找一种方法来过滤所有/除了/文件/目录列表.有人知道这样做的方法吗?

jke*_*ing 47

只是为了关闭循环,所以它似乎回答了.

通过使用index-filtertree-filter然后应用反向逻辑(如git ls-tree管道传输到(多个)grep -v管道中xargs,git rm您确实可以删除与一组窄文件名/目录不匹配的所有内容.这是我用来分割我的特定文件的命令:

git filter-branch \
    --prune-empty \
    --index-filter '
        git ls-tree -z -r --name-only --full-tree $GIT_COMMIT \
        | grep -z -v "^src/pyfedpkg$" \
        | grep -z -v "^src/fedpkg" \
        | grep -z -v "^git-changelog" \
        | xargs -0 -r git rm --cached -r
    ' \
    -- \
    --all
Run Code Online (Sandbox Code Playgroud)

  • 当文件在提交中全部进入树中时,"grep | xargs git rm"部分将导致非零退出代码并且[--index-filter将失败](https://github.com/ GIT中/ GIT中/提交/ 8c1ce0f46b85d40f215084eed7313896300082df).我不得不用-r或--no-run-if-empty选项(GNU扩展)来扩充xargs.我建议增加答案. (3认同)
  • 如果你希望它与所有可能的文件名可靠地工作,你会想要将`-0`与`xargs`和`-z`与`git ls-tree`和`grep`一起使用. (2认同)
  • @jkeating辉煌 - 我印象非常深刻,我刚刚创建了一个[`git splits`](https://github.com/simpliwp/git-splits)扩展,将其整合到git中. (2认同)