这是我的设置......
笔记本电脑(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)
答案 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
到您的拇指驱动器。基本上,强行更新拇指驱动器。但说实话,我不是一个傻瓜大师。