我一直在使用git-svn,最近,我在尝试提交时遇到错误(我认为这是由于libneon中的一个bug造成的,但这超出了这个问题的范围)。解决方案是使用git svn clone
重新克隆我的git存储库。然而,我在我的旧git库中的主分支上有一些更改,我无法使用git svn dcommit
将这些更改提交到svn。我想在使用git svn克隆的新存储库上重播这些更改。我想我可能可以使用git format-patch
导出一个补丁集,然后在新的存储库上重放这些更改,但我不完全确定如何做到这一点,我想知道是否有更简单或更优雅的方法来完成这一点。
发布于 2011-03-17 23:48:58
从新存储库中,添加对旧存储库的远程引用:
git remote add temp file:///path/to/old/repo/on/your/machine
从旧的存储库获取:
git fetch temp
查看旧存储库中的主分支:
git checkout temp/master -b wip
(wip代表正在进行的工作)
在当前存储库中的内容之上重新设置更改的基础:
git rebase master
将master更新为指向您的新头部:
git checkout master
git merge wip
删除对旧存储库和您使用的wip分支的远程引用:
git branch -d wip
git remote rm temp
您实际在做的事情:
首先,通过添加远程引用和获取,您可以从以前的存储库中提取当前存储库中还没有的提交。Git知道如何做到这一点,因为,无论它在哪里或如何进行,相同的提交在任何地方看起来都是一样的。它是一些众所周知的信息的SHA1散列,包括目录树、提交者、时间戳等。
因此,当您基于相同的SVN存储库创建一个新的Git存储库时,所有提交都具有相同的SHA1和。因此,您获取到当前存储库中的新提交继续指向正确的内容。这很酷,记住这一点很重要。
然后切换到temp的master分支的顶端,并告诉它重新建立到您当前的master上。rebase可能是不必要的,因为来自SVN的master可能没有从旧repo中的master移走,但最好是安全的。
rebase通过回溯两个提交的历史,直到它们都指向同一个父提交,从而找到两个提交之间最近的共同点。然后,它切换到您为其指定的分支名称(在本例中为master
),并从原始分支的历史记录中挑选缺失的每个提交。一旦完成,它将指向您在上次应用提交时所在的分支。
最后,master和wip的合并只是为了将master快进到底。因为它是一条直线,所以它真的只是一个快进。您可以很容易地完成rebase或reset --hard;任何这些操作都会改变主分支,使其指向正确的位置。Merge是其中最安全的,因为如果发生了一些奇怪的事情,它会让你知道这不是一个简单的快进。
https://stackoverflow.com/questions/5340790
复制相似问题