2010-05-04 68 views
2

这里是我的设置...GIT克隆多台计算机上

笔记本电脑(Mac) - 屏幕SVN仓库

优盘混帐克隆 - 笔记本电脑的Git仓库的混帐克隆

服务器(赢服务器08 ) - 拇指驱动器存储库的git的克隆

我无法让他们在同步出于某种原因...

如果我让服务器上的变化,我会做拇指驱动器上的“git pull”以获取更改。把拇指驱动器放到笔记本电脑上,然后在笔记本电脑上“拉动”。从那里,我可以做“git svn dcommit”,一切顺利到SVN回购没有问题。

如果我通过“git svn rebase”从SVN中获取更改,然后拉到拇指驱动器上并执行“git status”,它表示我在主/来源之前##修订,我可以不知道为什么。

服务器

>git remote show 
origin 

>git remote show origin 
* remote origin 
    Fetch URL: E:/proj 
    Push URL: E:/proj 
    HEAD branch: master 
    Remote branch: 
    master tracked 
    Local ref configured for 'git push': 
    master pushes to master (local out of date) 

笔记本

>git remote show 
(nothing) 

>git remote show origin 
fatal: 'origin' does not appear to be a git repository 
fatal: The remote end hung up unexpectedly 

拇指驱动器

>git remote show 
origin 

>git remote show origin 
* remote origin 
    Fetch URL: /Users/me/ui/proj 
    Push URL: /Users/me/ui/proj 
    HEAD branch: (unknown) 
    Remote branch: 
    master tracked 
    Local branch configured for 'git pull': 
    master merges with remote master 
    Local ref configured for 'git push': 
    master pushes to master (up to date) 
+0

你可能会添加'git remote show'的输出,特别是'git remote show origin'吗?这可能会更容易找出你的设置如何工作。谢谢! (哦,对于每个回购当然,忘了那。:-D) – 2010-05-04 17:22:43

+0

上面添加的信息... – Adam 2010-05-04 17:40:12

+0

这些是用git-svn创建的仓库,哪些是这些仓库的克隆? – 2010-05-05 23:32:30

回答

5

像拉的Git命令实际上并不适用rebase。

假设您的笔记本电脑上有一些不在svn中的提交,并且拇指驱动器同步。这样的事情:

laptop: 
svn1 -- svn2 -- A -- B -- C -- D 

thumb drive: 
svn1 -- svn2 -- A -- B -- C -- D 

然后,你做git svn rebase从svn获取新的东西。这工作分两个步骤:

现在我们必须把新的svn的顶部使用Git的工作承诺,所以我们仍然有非支历史。这是底垫部分:

laptop (after git svn rebase) 
svn1 -- svn2 -- svn3 -- svn4 -- A' -- B' -- C' -- D' 

现在,如果没有冲突,犯了”包含了同样的变化老犯,唯一不同的就是它的祖先:SVN4代替svn2。由于历史是git中每次提交的一部分,因为git A和A'是不同的提交。

所以,如果你的笔记本电脑回购做git pull拇指驱动器回购后,混帐做什么是很自然的吧,这是合并新的变化:

thumb drive (after git pull) 
svn1 -- svn2 -- svn3 -- svn4 -- A' -- B' -- C' -- D' 
      \           \ 
      + A -- B -- C -- D -------------------- merged result 

这使得git的完整意义上的,因为它允许它跟踪非线性环境中的所有变化,并注意谁合并以及如何进行合并。但是,你将无法将这种历史提交给svn。

如果强制推更改您的拇指回购,你最终的东西是这样的:

thumb drive (after forced push) 
svn1 -- svn2 -- svn3 -- svn4 -- A' -- B' -- C' -- D' 

,如果你还没有做的拇指驱动器回购任何变化,这是完全没问题。如果你这样做,这会覆盖他们。为了保持拇指驱动器的变化,你必须在那里再做一次git rebase

我想说,要充分利用git的舒适性,你必须放弃将工作交给svn的能力。有没有简单的方法来同时分布式版本控制和线性历史。

+0

这是很多非常好的信息!因此,不会直接在拇指驱动器上进行更改。它仅用作服务器和笔记本电脑的中介。我们只需要偶尔执行此操作,因为我们现在只需部署到服务器。 有没有办法使这项工作?我们希望能够从服务器(在集成过程中)维护更改历史记录,然后能够将服务器快速更新到最新,最好的状态。 – Adam 2010-05-04 17:45:55

+0

非常好的例证,正是我在想什么。 – dlamotte 2010-05-04 18:19:12

+0

@Adam:如果你将所有这些部署到服务器上,IMO最好的办法是在拇指驱动器上设置'remote。(name).fetch'选项来镜像笔记本电脑回购(我认为设置是'+ refs/heads/*:refs/heads/*'),并使用拇指驱动器在服务器上执行相同操作。所有你需要做的就是在服务器上运行'git fetch(laptop)',并在服务器上运行'git fetch(thumb)&&git checkout -f(my_chosen_branch)'。 (请注意,这将覆盖拇指和服务器仓库上的所有本地更改。) – che 2010-05-05 22:55:06

0

这是因为git svn rebase代码变基库中所有的提交。如果任何git提交你没有提交到上游repo,commit id将会改变,你的其他仓库将不会看到这个改变。这是我现在最好的猜测。你的工作流程对我来说有点困惑。一个ascii图可能会有所帮助,但这将有点工作;)

在我看来,最好的方法可能是git push -f ...git svn rebase后你的拇指驱动器。基本上,强行更新拇指驱动器。但说实话,我不是一个混帐大师。

+0

这很有道理......我如何防止/修复这个问题? – Adam 2010-05-04 16:54:22

+1

不幸的是,请参阅git-svn联机帮助页中的CAVEATS部分。不建议使用git-svn存储库进行克隆,推送和拉取。 我有一个问题要等待Subversion,git或其他DVCS需要做什么,以便它们真正可以互操作。 – 2010-05-05 23:31:34