gpt4 book ai didi

git - 执行git subtree split时遵循renames

转载 作者:IT王子 更新时间:2023-10-29 01:27:52 27 4
gpt4 key购买 nike

我有许多子目录,我想将它们提取到一个单独的存储库中。为了使用单个命令提取它们,我将它们移动(重命名)到根目录中的单个子目录中。

然后我运行:git subtree split -P my_new_subdir -b newbranch

如果我随后 check out 这个新分支并运行 git log --follow someoldfile 它只会显示与移动到临时子目录有关的日志条目。我想保留这些文件的完整历史记录。

有没有办法保留完整的历史记录,包括进行子树拆分时的重命名?是否有其他方法可以达到预期的结果?

我考虑过在 repo 的克隆上使用 filter-branch,但我知道那会很慢。

最佳答案

实际上这是可能的,这个问题已经在这里提出过几次,虽然没有通用的方法,看起来你必须编写自己的食谱。

如果您只想保留 my_new_subdir 中的文件,您实际上需要自己删除所有其他文件。这个概念是使用:

git filter-branch --tag-name-filter cat --index-filter \
'git rm -r --cached --ignore-unmatch
unneeded-subdir-1 unneeded-pattern-* unneeded-etc' \
--prune-empty -f -- --all

然后为了帮助找到其他必须删除的内容,您可以使用以下内容:

git log --name-status --all  | grep -P '^\w\s+[\S]+$'

甚至例如:

git log --name-status --all  | grep -P '^\w\s+[\S]+$' | \
sed s/^.// | cut -f 1-2 -d '/' | sort -u

通过这种方式,您可以随时找到存储库中存在的所有文件/目录(或者在第二种情况下只是路径的前两段)。之后,您可以使用以下命令清理存储库:

git gc --aggressive

所以在将文件移动到 my_new_subdir 之后,我使用了上述命令的组合来从历史记录中清除任何不需要的文件。然而,我仍然在历史中发现了不相关的 merge ,但最终我对结果感到满意。请注意,上面有一些 git 命令的参数,这些参数对于遍历所有历史记录、分支和标签至关重要。

为了加快速度,您可以在第一次迭代中确定要删除的 repo 的最大部分,然后执行 git gc --aggressive。使用 i5 CPU 和 SSD 磁盘,我花了大约一分钟的时间来完成一次 git filter-branch 迭代,并处理了大约 1000 个历史条目。

关于git - 执行git subtree split时遵循renames,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26304941/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com