如何使用 git 来实现这个特定目的?

如何使用 git 来实现这个特定目的?

情况是这样的。有两台机器,笔记本电脑A和工作站B。B有固定IP,A有动态IP,我想避免从B连接到A(例如设置ssh隧道;为了参数,假设从 B 到 A 的 ssh 是不可能的)。

/home/user/foo.git两台机器上都有一个 git 存储库。问题:处理 A,合并A:/home/user/foo.git和上的更改B:/home/user/foo.git。最后,两个存储库应该是相同的。

我能想到的最简单的解决方案如下:

A:~$ cd foo.git
A:~/foo.git$ git commit -a
A:~/foo.git$ ssh B
B:~$ cd foo.git
B:~/foo.git$ git commit -a
B:~/foo.git$ logout
A:~/foo.git$ git pull ssh://B/home/user/foo.git
A:~/foo.git$ git push ssh://B/home/user/foo.git master

(在能够做到这一点之前,我必须更改 B 上的 git 配置并添加一个 post-receive 挂钩,如对此的答案中所述堆栈溢出问题

我的问题:

1)以上正确吗? 2)是否有更简单的方法可以达到相同的目的?

答案1

您的接收后挂钩在我看来,有一些非常可怕的警告!

我有类似的设置,但服务器 B 有两个存储库副本。一个是裸存储库,用作两者的默认远程(“源”)。然后我就不必为“git push”和“git pull”提供参数。最后是我对您提到的命令的唯一简化。 (在我的例子中,B 是一台服务器;我有一个 ARM 盒子,我可以留在上面)。

如果你“并不真正使用 Git”,这不一定是最好的主意。 Git 是为强大而设计的,并且 UI 仍然不像其他 DVCS 那样一致。用于此用途的更简单的工具可能包括

http://git-annex.branchable.com/assistant/(新的-我还没试过)

http://www.cis.upenn.edu/~bcpierce/unison/(旧备用,通过 ssh 工作)

Dropbox(非免费,需要互联网连接,但很灵活,也会优化 LAN 上的传输)

或者有 Mercurial 甚至 Darcs。我认为两者都可以避免 Git 需要额外的裸存储库或令人担忧的提交挂钩的问题。 Mercurial 应该比 Git 更用户友好。 Darcs 的设计与任何其他 DVCS 都不同……所以这可能不是最好的主意。看看文档,Bazaar 似乎对这种情况持怀疑态度。

答案2

如果你无法从 B ssh 到 A,但可以从 A ssh 到 B,那么建立反向 ssh 隧道

答案3

我认为git这对你不好,我也认为rsync它更适合您的任务,因为您只需将文件保持同步,在我看来,git 并不理想,因为:

  • 您显然不需要任何分支/版本控制/分布式模型
  • 你需要处理文件,git 不直接处理文件,简而言之,git 将文件系统上的每个“对象”(基本上是文件和目录)视为 SHA1 哈希,因此没有办法真正恢复文件或简单地执行特定于文件的任何操作,git 唯一能够判断的是分支的内容是否更改,仅此而已,并且它甚至不会在中间保留真正的跟踪,例如例如,校验和是在您提交时完成的,而不是在将文件添加到阶段时完成的。

相关内容