将两个git-svn存储库与顶部的常规git提交合并



我在家里使用的是Arch Linux存储库中的git 1.8.5.3版本,在工作中使用的是Ubuntu13.10中的git 1.8.1.2版本。在工作中,我们使用svn,所以我使用git-svn处理它。

我在工作和家庭中都使用git-svn检查了svn存储库。包含git-svn-id的提交消息是相同的。作者和日期也是如此。但是,生成的提交哈希并不相同。

git svn fetch && git svn rebase 

工作良好。然而,如果我试图通过git将我在其中一个存储库上进行的一些提交合并在两者之间,git自然无法检测到父级,并抛出合并错误。

我想,这只能是由于哈希计算的变化。这也会破坏其他git存储库,所以这可能是与git-svn有关的问题。

第一次编辑

git log --pretty=raw

显示所有提交的不同父级。这解释了不同的散列,但这最初是如何发生的?事实证明,如果我一直回到第一次提交,它们确实有相同的父级,因此有正确的哈希。所以,在这一过程中的某个地方,一定发生了什么变化。。。

第二次编辑

使用找到最后一个通用提交哈希

git merge-base branch1 branch2

下面的提交是一个svn合并分支。这是预期的行为吗?

第三次编辑

有效的方法是使用

git cherry-pick hash

并逐一应用提交。。。

更新

都是我的错。我在工作时查看了整个svn回购,但在家里只查看了主干。这就是为什么从两个svn分支的合并开始,提交散列就不同了。

我知道这种情况,我自己通过git-SVN与一些同事一起使用SVN存储库。

你基本上有两个选择:

简单的方法是只通过SVN共享代码。这是一个简单的解决方案,因为您只会将Git用作具有强大本地功能的复杂SVN客户端。这里唯一的警告是:永远不要重新建立已经进入SVN的承诺的基础!或者使用重新基准等效操作。Git-svn在内部使用Git-rebase来同步进入svn的更改,而您的本地副本没有注意到,并且必须重新排序您的本地提交。

如果你认为通过Git共享代码是个好主意,而不涉及SVN,事情就会变得更加复杂。

首先,您应该从SVN克隆存储库开始。这个存储库应该是每个人的主存储库,它应该包含远程SVN分支,以及您可能需要的SVN中每个分支的本地跟踪分支。如果你需要的话,你以后也可以创建它们。

要将存储库复制到新机器,请将整个repo目录(包括.git目录)复制到新计算机。

要共享代码,请在某个地方创建一个远程Git repo,并将其作为新的远程添加到每个本地repo中。然后你就可以推了。

注意不要推动跟踪SVN的分支!您的代码共享世界现在分为两种分支:一种是仅Git分支。然后你可以将它推送到你想要的任何其他Git回购。或者分支正在跟踪SVN分支。然后你不能把它推到任何地方共享代码。

对于只使用Git的分支,Git的常规规则适用:在对任何被推送的内容进行重定基时要小心(即不要重定基!)。

有了SVN分支,情况就不一样了。我自己的工作流程是这样的:

git checkout master
git add stuff 
git commit 
git push                  // regular GIT workflow until here...
git checkout svntrunk     // name of the local branch tracking SVN trunk
git svn fetch             // get all updates from SVN in any branch
git svn rebase            // update trunk in local svntrunk tracking branch
git merge master --no-ff  // merge local master to SVN - fast-forward is not allowed
// because SVN has no way of be alike - your changes have
// to be a regular commit in the SVN branch
git svn dcommit           // move that commit into SVN repo
git svn tag v0.0.1-alpha  // optional, but tagging in SVN only works after dcommit
git checkout master       // back to work

更新与SVN分支相关的分支将使用rebase操作。因此,应用Git关于推送基于重基的分支的常规规则,很明显这是行不通的!所以不要推送SVN跟踪分支。不要拉他们。只将它们放在本地,并从SVN进行更新。

这种两个分支的工作流程不是很好。它允许您通过Git与同事共享代码,但它使SVN存储库中的每个分支都加倍。根据有多少人进行合并,svn跟踪分支将包含许多提交,这些提交实际上是他们的合并提交,但您的本地Git回购不会将它们识别为合并。因此,本地Git存储库中的SVN分支只知道您的合并。

如果你的一些同事在没有Git的情况下直接使用SVN,情况会变得更糟。这样,您还必须将svntrunk中的更改合并回master。我没有这方面的经验,但我想说,在这种情况下,最好避免通过Git共享代码,并保持在单Git-svn-reo的情况下。否则会变得很乱。

最新更新