【问题标题】:Splitting a set of files within a git repo into their own repository, preserving relevant history [duplicate]将 git repo 中的一组文件拆分到自己的存储库中,保留相关历史记录 [重复]
【发布时间】:2011-08-25 08:00:42
【问题描述】:

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

有一次,我将我的代码添加到了现有的 git 存储库中,并且从那以后已经提交了很多,而另一位开发人员已经提交了存储库中的其他现有文件。 现在我想将我的代码拆分到自己的仓库中,但保留我的特定文件的所有更改历史记录。

阅读其他人为拆分代码所做的工作,我查看了filter-branch,并对我不关心的文件使用rm 命令执行--index-filter--tree-filter。我不想使用--subdirectory-filter,因为保存我的代码的子目录不适合作为顶层目录(我们也共享一个子目录)。更复杂的是,原始存储库中的一些文件随着时间的推移发生了一些变化,并且有一些文件被创建然后被删除。这使得设计一个 rm 列表有点……具有挑战性。

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

【问题讨论】:

  • 谢谢。用git filter-branch --prune-empty --index-filter 'git ls-tree -r --name-only --full-tree $GIT_COMMIT | grep -v "^src/pyfedpkg$" |grep -v "^src/fedpkg" |grep -v "^git-changelog" | xargs git rm --cached -r' -- --all完成它
  • stackoverflow.com/questions/2797191/…(恕我直言)不同,因为它要求保留一组特定的稀疏文件。
  • 这不是重复的!那里提供的问题/答案 (2797191) 仅适用于单个目录下的文件。这个问题要求一组文件,不必要地分组在一个目录下。

标签: git git-filter-branch


【解决方案1】:

只是为了关闭此循环,使其显示为已回答。

通过使用index-filtertree-filter,然后应用反向逻辑,如git ls-tree 管道到(多个)grep -v 管道到xargs for 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

【讨论】:

  • 当一个文件在提交中被单独带入树时,“grep | xargs git rm”部分将导致非零退出代码和--index-filter will fail。我不得不使用 -r 或 --no-run-if-empty 选项(GNU 扩展)来扩充 xargs。我建议增加答案。
  • 这对我来说失败了" "pathspec 'SomeDir/SomeSubDir' did not match any files." SomeSubDir 只是包含空格的子目录名称的第一部分。所以看起来这个解决方案确实不适用于包含空格的子目录的存储库。任何可能的解决方法?
  • 如果您希望它与所有可能的文件名一起可靠地工作,您需要将-0xargs-zgit ls-treegrep 一起使用。
  • -q 添加到git rm 命令也有助于避免输出被rm '...' 日志行淹没。
  • @jkeating太棒了——我印象非常深刻,我刚刚创建了一个git splits扩展,将其合并到git中。
猜你喜欢
  • 2017-08-17
  • 2011-04-22
  • 1970-01-01
  • 1970-01-01
  • 2016-04-18
  • 1970-01-01
  • 1970-01-01
  • 2018-09-02
  • 1970-01-01
相关资源
最近更新 更多