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

时间:2011-05-14 00:13:07

标签: git git-filter-branch

  

可能重复:
  How to split a git repository while preserving subdirectories?

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

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

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

1 个答案:

答案 0 :(得分:45)

只需关闭此循环就可以显示已回答。

使用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