gpt4 book ai didi

git - 在 git 中提取一个已重命名的子目录历史记录

转载 作者:太空狗 更新时间:2023-10-29 14:13:56 25 4
gpt4 key购买 nike

我知道我可以使用如下命令提取 git 中指定分支的给定文件夹的历史记录:

git filter-branch --subdirectory-filter "a sub directory" -- myBranch

不幸的是,该子目录在历史上的某个时刻被重命名,例如从 a subdirectoryaSubdirectory。不幸的是,filter-branch 在重命名时停止了。

有没有办法做到这一点?

最佳答案

git filter-branch --prune-empty --index-filter '
git ls-files -z |
egrep --invert-match --null-data "^(a subdirectory|aSubdirectory)/" |
xargs -0 --no-run-if-empty git rm --cached -q

git ls-files -s | sed -re "s-\t(a subdirectory|aSubdirectory)/-\t-" |
git update-index --index-info

git ls-files -z |
egrep --null-data "^(a subdirectory|aSubdirectory)/" |
xargs -0 git rm --cached -q
' -- myBranch

重命名文件是一项高级操作(哈!),因此我们将其分解为删除和添加组件。

脚本中的第一个命令删除a subdirectoryaSubdirectory 之外的所有内容。第二个将这些目录中的所有内容添加到存储库根目录中。最后,第三个通过删除这些目录中的所有文件来完成移动。

例如,从历史开始

$ git lol --name-status* 27c7275 (HEAD, myBranch) file2| A     aSubdirectory/file2* 39d7e75 mv| D     a subdirectory/file1| A     aSubdirectory/file1* c710654 file1  A     a subdirectory/file1

运行上面的 git filter-branch 命令会产生一个历史记录

$ git lola --name-status* da6c7ae (HEAD, myBranch) file2| A     file2* d94110a file1  A     file1* 27c7275 (refs/original/refs/heads/myBranch) file2| A     aSubdirectory/file2* 39d7e75 mv| D     a subdirectory/file1| A     aSubdirectory/file1* c710654 file1  A     a subdirectory/file1

refs/original/refs/heads/myBranch 是一个备份,在验证结果后,可以丢弃

git update-ref -d refs/original/refs/heads/myBranch

离开

$ git lola* da6c7ae (HEAD, myBranch) file2* d94110a file1

注意事项:

  • 由于 --prune-empty,重命名目录的提交消失了。
  • 我不知道这将如何处理重命名冲突。
  • git lolgit lola 是非标准的,但是 highly useful aliases

关于git - 在 git 中提取一个已重命名的子目录历史记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19934565/

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