gpt4 book ai didi

git - 将子目录(已重命名!)分离到新的 repo 协议(protocol)中

转载 作者:太空狗 更新时间:2023-10-29 12:47:05 25 4
gpt4 key购买 nike

我有一个存储库,我想将其中一个目录分离到一个新的存储库中。 This是一个完美的起点,但是有一个警告:我想要分离的目录在某个时候被重命名了。如果我按照该帖子中的解决方案使用目录的新名称,那么我似乎在重命名之前丢失了历史记录。有任何调整以使其在这种情况下起作用的想法吗?

最佳答案

git filter-branch 可以对提交范围进行操作;所以我们可以做的是分别过滤“之前”和“之后”,然后使用移植物将它们粘在一起:

git branch rename $COMMIT_ID_OF_RENAME 
git branch pre-rename rename~
## First filter all commits up to rename, but not rename itself
git filter-branch --subdirectory-filter $OLDNAME pre-rename
## Add a graft, so our rename rev comes after the processed pre-rename revs
echo `git rev-parse rename` `git rev-parse pre-rename` >> .git/info/grafts
## The first filter-branch left a refs backup directory. Move it away so the
## next filter-branch doesn't complain
mv .git/refs/original .git/refs/original0
## Now filter the rest
git filter-branch --subdirectory-filter $NEWNAME master ^pre-rename
## The graft is now baked into the branch, so we don't need it anymore
rm .git/info/grafts

如果您需要过滤多个分支或标签,这会稍微复杂一些;重命名之前的分支可以包含在第一个过滤器分支中,而之后的分支必须包含在第二个过滤器分支中的 ^rename 之前。

另一种选择是添加一个索引过滤器(或树过滤器),而不是检查新旧目录,并保留存在的那个。

由于您没有提供测试存储库,这里有一个针对此场景的快速完整性检查脚本:

#!/bin/bash

set -u
set -e
set -x

rm -rf .git x y foo

git init
mkdir x
echo initial > x/foo
git add x/foo
git commit -m 'test commit 1'

echo tc2 >> x/foo
git commit -a -m 'test commit 2'

mv x y
git rm x/foo
git add y/foo
git commit -a -m 'test rename'

git branch rename HEAD

echo post rename >> y/foo
git commit -a -m 'test post rename'

git branch pre-rename rename~

git filter-branch --subdirectory-filter x pre-rename
echo `git rev-parse rename` `git rev-parse pre-rename` >> .git/info/grafts

mv .git/refs/original .git/refs/original0

git filter-branch --subdirectory-filter y master ^pre-rename

rm .git/info/grafts

git log -u

如果此过程对您不起作用,那么您的存储库历史可能存在您未描述的其他奇怪情况,例如 stash 在历史中的另一个重命名。

关于git - 将子目录(已重命名!)分离到新的 repo 协议(protocol)中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6638019/

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