多台机器上的GIT克隆

Ada*_*dam 2 svn git git-svn

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

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

拇指驱动器 - 笔记本电脑git存储库的git克隆

服务器(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)
Run Code Online (Sandbox Code Playgroud)

笔记本电脑

>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
Run Code Online (Sandbox Code Playgroud)

拇指驱动器

>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)
Run Code Online (Sandbox Code Playgroud)

che*_*che 5

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

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

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

thumb drive:
svn1 -- svn2 -- A -- B -- C -- D
Run Code Online (Sandbox Code Playgroud)

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

laptop (after fetching from svn)
svn1 -- svn2 -- svn3 -- svn4
          \
           + A -- B -- C -- D
Run Code Online (Sandbox Code Playgroud)

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

laptop (after git svn rebase)
svn1 -- svn2 -- svn3 -- svn4 -- A' -- B' -- C' -- D'
Run Code Online (Sandbox Code Playgroud)

现在,如果没有冲突,提交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
Run Code Online (Sandbox Code Playgroud)

这在git中完全有意义,因为它允许它跟踪非线性环境中的所有更改,并记录谁进行了合并以及如何进行.但是,您将无法将此类历史记录提交给svn.

如果你强制推动你的拇指回购改变,你最终得到这样的东西:

thumb drive (after forced push)
svn1 -- svn2 -- svn3 -- svn4 -- A' -- B' -- C' -- D'
Run Code Online (Sandbox Code Playgroud)

如果您没有对拇指驱动器回购进行任何更改,这是完全正常的.如果你这样做,这将覆盖它们.要保持拇指驱动器更改,您必须在那里再做一次git rebase.

我要说的是,为了充分利用git,你必须放弃将你的工作投入svn的能力.没有简单的方法可以同时拥有分布式版本控制和线性历史记录.