Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Svn 多台机器上的GIT克隆_Svn_Git_Git Svn - Fatal编程技术网

Svn 多台机器上的GIT克隆

Svn 多台机器上的GIT克隆,svn,git,git-svn,Svn,Git,Git Svn,这是我的设置 笔记本电脑Mac-svn存储库的git克隆 Thumb drive-笔记本电脑git存储库的git克隆 Server Win Server 08-拇指驱动器存储库的git克隆 由于某种原因,我无法保持它们的同步 如果我在服务器上进行更改,我将在thumb驱动器上执行git拉取以获得更改。把拇指驱动器拿到笔记本电脑上,在笔记本电脑上做git pull。从那里,我可以做git-svn-dcommit,一切都可以顺利地转到svn-repo 如果我使用git SVN rebase从SVN中

这是我的设置

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

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

Server Win Server 08-拇指驱动器存储库的git克隆

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

如果我在服务器上进行更改,我将在thumb驱动器上执行git拉取以获得更改。把拇指驱动器拿到笔记本电脑上,在笔记本电脑上做git pull。从那里,我可以做git-svn-dcommit,一切都可以顺利地转到svn-repo

如果我使用git SVN rebase从SVN中提取更改,然后在thumb驱动器上执行拉取操作,并执行git状态,它会显示我比主/源版本提前了修订,我不知道为什么

服务器

>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)
这是因为git svn rebase代码对存储库中的任何提交都进行了重定。如果您所做的任何git提交都没有提交到上游repo,那么提交id将发生变化,而您的其他存储库还没有看到这种变化。这是我现在最好的猜测。你的工作流程让我有点困惑。ascii图可能会有所帮助,但这需要一点工作


在我看来,最好的方法可能是git push-f。。。每次git svn重新设置基础后,都会将其添加到您的拇指驱动器。基本上,强制更新thumb驱动器。但老实说,我不是git大师。

像pull这样的git命令在使用回扣时并不起作用

假设在您的笔记本电脑上,您有一些尚未在svn中的提交,并且thumb drive处于同步状态。大概是这样的:

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

thumb drive:
svn1 -- svn2 -- A -- B -- C -- D
thumb drive (after forced push)
svn1 -- svn2 -- svn3 -- svn4 -- A' -- B' -- C' -- D'
然后,您可以使用git svn rebase从svn获取新内容。这分为两个步骤:

laptop (after fetching from svn)
svn1 -- svn2 -- svn3 -- svn4
          \
           + A -- B -- C -- D
现在我们必须将您的git工作放在新的svn提交之上,所以我们仍然有未分支的历史记录。这是重基部分:

laptop (after git svn rebase)
svn1 -- svn2 -- svn3 -- svn4 -- A' -- B' -- C' -- D'
现在,如果没有冲突,commit A'包含与旧commit A相同的更改,唯一不同的是它的祖先:svn4而不是svn2。因为历史是git中每个提交的一部分,所以对于git,a和a是不同的提交

因此,在您将git从膝上型repo拉到thumb drive repo后,git会执行它的自然操作,即合并新的更改:

thumb drive (after git pull)
svn1 -- svn2 -- svn3 -- svn4 -- A' -- B' -- C' -- D'
          \                                         \
           + A -- B -- C -- D -------------------- merged result
这在git中是完全有意义的,因为它允许它跟踪非线性环境中的所有更改,并记录谁进行了合并以及如何进行合并。但是,您将无法将此类历史提交给svn

如果您强制将更改推送到thumb repo,您将得到如下结果:

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

thumb drive:
svn1 -- svn2 -- A -- B -- C -- D
thumb drive (after forced push)
svn1 -- svn2 -- svn3 -- svn4 -- A' -- B' -- C' -- D'
如果您没有对thumb drive repo进行任何更改,这是完全正确的。如果您这样做,这将覆盖它们。为了保持对thumb驱动器的更改,您必须在那里再进行一次git重基


我想说的是,为了充分利用git的便利性,您必须放弃将工作提交给svn的能力。要同时拥有分布式版本控制和线性历史记录,没有简单的方法。

这是有道理的……我如何防止/修复它?遗憾的是,请参阅git svn手册页中的“注意事项”部分。不建议使用git svn存储库进行克隆、推送和拉取。我有一个悬而未决的问题,关于Subversion、git或其他一些DVC需要做什么才能真正实现互操作。您是否可以添加git remote show的输出,特别是git remote show origin的输出?这可能会使您更容易了解设置的具体工作方式。谢谢哦,当然,每次回购都忘了这一点-其中哪些是使用git svn创建的存储库,哪些是这些存储库的克隆?使用rsync-delete-a更新远程存储库。。。从执行git svn dcommit的机器上获取的.git目录。这是很多非常好的信息!因此,不会直接在thumb驱动器上进行任何更改。它仅用作服务器和笔记本电脑的中间接口。我们只需要偶尔这样做,因为我们只是偶尔部署到服务器上。有没有办法让这一切顺利进行?我们希望能够在集成过程中维护服务器的更改历史记录,然后能够将服务器快速更新为最新和最好的版本。@Adam:如果您这样做是为了部署到服务器,我认为最好的办法是在thumb drive上设置remote.name.fetch选项,以便只镜像笔记本电脑的repo。我认为设置为+refs/heads/*:refs/heads/*并在thumb drive服务器上执行相同的操作。然后,您所要做的就是在thumb drive repo上运行git fetch laptop,并在服务器上运行git fetch thumb&&git checkout-f my_Selected_分支。请注意,这将覆盖thumb和服务器repo上的任何本地更改。@Adam:或。。。若您需要仅在服务器上保留本地更改,可以将其远程设置保持为默认设置,让它将新分支获取到thumb/blahblah,并通过git checkout thumb/latest_和_grest部署它们。