多台机器上的GIT克隆

时间:2010-05-04 16:30:17

标签: svn git git-svn

这是我的设置......

笔记本电脑(Mac) - svn存储库的git clone

Thumb drive - 笔记本电脑git存储库的git clone

服务器(Win Server 08) - 拇指驱动器存储库的git clone

由于某种原因,我无法让它们保持同步......

如果我在服务器上进行更改,我会在拇指驱动器上执行“git pull”以获取更改。将拇指驱动器带到笔记本电脑上并在笔记本电脑上进行“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)

2 个答案:

答案 0 :(得分:5)

像pull这样的Git命令实际上不能用于rebase。

让我们说在你的笔记本电脑上,你有一些不在svn中的提交,并且拇指驱动器是同步的。像这样:

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

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

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

laptop (after fetching from svn)
svn1 -- svn2 -- svn3 -- svn4
          \
           + A -- B -- C -- D

现在我们必须将你的git工作放在新的svn提交之上,所以我们仍然有非分支的历史记录。这是rebase的一部分:

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

现在,如果没有冲突,提交A'包含与旧提交A相同的更改,唯一不同的是它的祖先:svn4而不是svn2。由于历史是git中每个提交的一部分,因为git A和A'是不同的提交。

因此,当您从笔记本电脑仓库到拇指驱动器仓库进行git pull后,git会对其进行自然的处理,这会合并新的更改:

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的能力。没有简单的方法可以同时进行分布式版本控制和线性历史记录。

答案 1 :(得分:0)

这是因为git svn rebase代码重新定义了存储库中的任何提交。如果任何git提交你没有提交到上游仓库,那么提交ID将会改变,而你的其他仓库也不会看到这种改变。这是我现在最好的猜测。你的工作流程对我来说有点混乱。 ascii图可能会有所帮助,但这只是一点工作;)

在我看来,执行此操作的最佳方法可能是在git push -f ...git svn rebase到您的拇指驱动器。基本上,强行更新拇指驱动器。但说实话,我不是一个傻瓜大师。