同步 .git 目录的 rsync

28

这个问题可能是基于我对.gits和git仓库在一般情况下的理解不足,但是:

我可以在两台机器之间使用rsync同步我用git init创建的内容吗?

我在我的笔记本电脑上有一个仓库,唯一的方法是通过scp/rsync将其传输到远程主机,然后再从该主机下载。我能否在这些主机之间同步完整的目录结构?

6个回答

33

有几种可能性:

  • 你可以直接使用rsync命令同步.git仓库(或者将整个仓库和工作目录一起同步),前提是在同步期间没有对仓库进行任何操作(与使用rsync://协议的声明相同)。

  • 你可以使用已废弃的rsync协议克隆或获取仓库(仓库URL/位置看起来像这样:“rsync://host.xz/path/to/repo.git/”)。请注意,此协议已被弃用,因为如果仓库中有任何活动,您可能会得到损坏的克隆(或获取)。

    另外,据我所知,自2007年以来,在存在打包的引用时它就已经无法正常工作了,直到最近才有人注意到。它将在Git 2.8中消失。

  • 或者你可以创建git bundle,将其通过rsyncscp发送至其他机器,然后从bundle中进行克隆或获取。


2
正如我在下面的回答中所指出的那样,git的rsync://协议将仅在git 2.8中消失(自2016年3月起,即在被宣布为“已弃用”10年后!) - VonC
这个不再起作用了 - 给出错误 git-over-rsync 不再受支持 - M.M

12

是的,这是可能的。我记得 Git 使用相对路径方法,所以与另一台计算机同步是安全的。


1
如果在rsync期间您不对存储库进行任何工作,那么就有可能实现(但可能无法使用基于文件系统的远程和替代方式)。 - Jakub Narębski

6

是的,你可以这样做,但最好使用一个裸仓库,如这篇2012年的文章所示:

$ git clone --bare ./projet projet.git
$ rsync -a --stats --delete ./projet.git/ votre.serveur:~/projets/projet.git/

注意: 6年后,git 2.8(2016年3月)将正式弃用并完全删除git rsync协议!
请参见提交0d0bac6(2016年1月30日),作者为Jeff King (peff)(由Junio C Hamano -- gitster --提交9f03176中合并,于2016年2月17日)

事实证明,当源代码库长时间拥有打包引用时,“git clone”通过rsync传输是有问题的,但没有人注意到或抱怨过。

提交 0d0bac6 来自 Jeff King (peff),具体详情请查看。


2
裸仓库只在你想要向该仓库推送时才需要。但是,如果你每次只是复制仓库,那么你可以使用完整的仓库来完成它。 - Ikke
3
如果你使用rsync,你也可以将整个代码库进行同步。如果使用rsync,裸仓库并没有什么特殊之处。 - Milan Babuškov
@Ikke:没错,我通常会这样操作,目的是将其推送。 - VonC

6

您可以轻松使用rsync,但如果您有一些使用本地主机名声明的远程地址(即仅存储在/etc/hosts中),那么这些地址显然不起作用。

但是,您不使用git本身来同步内容是否有某些原因呢?


我发现我的远程服务器没有安装Git,所以我无法使用git push命令将代码推送到服务器。 - svrist
1
如果您想通过SSH使用push,则服务器上也必须安装git(但您可以在本地安装它,并使用--receive-pack选项进行git-push,以及类似的选项用于fetch/pull/clone)。如果您想通过HTTP推送,则只需要具有WebDAV的Web服务器,配置为允许您进行推送访问(不需要服务器上的git)。 - Jakub Narębski
git clone 对我来说一直卡着,我在网上找不到解决方案,所以rsync会对我的问题有所帮助,但我也不确定.git的某些内容是否是特定于主机的。 - Sridhar Sarnobat

1
是的,rsync同步.git目录是可行的,并将导致完整的存储库克隆。

0
使用rsync备份.git是可行的,但有一个限制(至少对我来说):它无法更新。下次再尝试rsync时,你会得到大量的对象重命名,而且你无法删除它们。由于不熟悉rsync或Linux系统,我在rsync之前清除了.git备份。

这就是:

> chmod -R 777 /path/of/your/backup/.git
> rm -fr /path/of/your/backup/.git
> rsync /path/of/your/origin/.git /path/of/your/backup/.git

我知道,这很繁琐和愚蠢... 请告诉我是否有更好的方法来做到这一点...


如果您的.git中的树有丝毫不同,它将添加大量数据。 - salotz
2
man rsync--delete delete extraneous files from dest dirs。这将从备份中删除Git的旧对象文件(以及源中已删除的任何其他文件)。您可能还需要使用 --recursive - Mark Haferkamp

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接