如何同步两个git存储库

时间:2011-02-01 07:55:01

标签: git offline-mode

我在不同的PC上有两个git存储库。我每个人都有一些当地的分支机构。我不想将这些分支发送到远程服务器,只需将它们保存在本地。如何在不使用网络的情况下进行同步?我可以在一台PC上压缩存储库并转移到另一台PC吗?这样安全吗?也许我可以从每个分支出口某种最新的变化?

4 个答案:

答案 0 :(得分:25)

我更喜欢制作 bundle (请参阅“How can I email someone a git repository?”),而不是制作裸克隆,这会生成一个文件复制(例如在USB记忆棒上)

奖金是确实具有裸仓的一些特征:你可以从中拉出或克隆它。
但只需要担心一个文件。

machineB$ git clone /home/me/tmp/file.bundle R2
  

这将在结果存储库中定义一个名为“origin”的远程,它允许您从捆绑中获取和提取。 $GIT_DIR/config中的R2文件将包含以下条目:

[remote "origin"]
    url = /home/me/tmp/file.bundle
    fetch = refs/heads/*:refs/remotes/origin/*
  

要更新生成的mine.git存储库,您可以在使用增量更新替换存储在/home/me/tmp/file.bundle的软件包后进行提取或提取。

     

在原始存储库中完成更多工作后,您可以创建增量包以更新其他存储库:

machineA$ cd R1
machineA$ git bundle create file.bundle lastR2bundle..master
machineA$ git tag -f lastR2bundle master
  

然后,您将捆绑包转移到另一台计算机以替换/home/me/tmp/file.bundle,并从中拉出。

machineB$ cd R2
machineB$ git pull

答案 1 :(得分:22)

请参阅this blog post "Synchronizing Git repositories without a server "Victor Costan)。

  

本文描述了一种在两个存储库之间推送更改的方法,而不使用具有与具有存储库的主机的网络连接的服务器

通过在USB记忆棒上创建存储库来启动。

mkdir /path/to/usb/stick/repository.git
git clone --local --bare . /path/to/usb/stick/repository.git

然后将USB存储库上的存储库注册为远程存储库,并将所需的分支推送到它(如果您不想推送主服务器,请替换所需的分支)。

git remote add usb file:///path/to/usb/stick/repository.git
git push usb master

将来,您可以将USB存储库视为任何其他远程存储库。只需确保它已安装:)例如,以下内容将新更改推送到USB存储库。

git push usb

在接收端,安装USB记忆棒,并使用存储库的文件URL

file:///path/to/usb/stick/repository.git

一些方便的命令:

# cloning the repository on the USB stick
git clone file:///path/to/usb/stick/repository.git
# updating a repository cloned from the USB stick using the above command
git pull origin
# adding the USB stick repository as a remote for an existing repository
git remote add usb file:///path/to/usb/stick/repository.git
# updating from a remote repository configured using the above command
git pull usb master

答案 2 :(得分:5)

将存储库直接复制到其他文件系统是裸克隆或捆绑的替代方法。复制后,您可以将复制的repo直接设置为本地远程 - 本地远程可能看起来不直观 - 获取并合并到第一个存储库。

即。将repo2从第二台计算机合并到〜/ repo1,首先将repo2复制到repo1文件系统〜/ repo2(记忆棒,网络副本等),然后你可以使用Git pulling changes between two local repositories的答案:

~/repo1 $ git remote add repo2 ~/repo2
~/repo1 $ git fetch repo2
~/repo1 $ git merge repo2/foo

这是有效的,因为the wikipedia article on git说:“Git存储库 - 数据和元数据 - 完全包含在其目录中,因此整个Git存储库的正常系统级复制(或重命名或删除)是安全操作。由此产生的副本既独立又不知道原件。“

答案 3 :(得分:0)

我只想为事情添加一点点扭曲。其他帖子中的信息似乎是正确的,但我想提一下我在实践中做的一些额外的事情。

如果我这样做

git remote -v

我收到这样的信息

USB_F   file:///f/Git_repositories/projectname.git (fetch)
USB_F   file:///f/Git_repositories/projectname.git (push)
USB_G   file:///g/Git_repositories/projectname.git (fetch)
USB_G   file:///g/Git_repositories/projectname.git (push)

基本上我已经定义了几个带有USB名称的遥控器,而不仅仅是建议的一个,因为分配给我的USB设备的驱动器号根据我插入的端口而改变。

然后我运行一个包含这样内容的脚本

cd /path/to/projectname

if [ -d /f/Git_repositories/projectname.git ] 
then
    git push USB_F --all
    git push USB_F --tags
fi
if [ -d /g/Git_repositories/projectname.git ] 
then
    git push USB_G --all
    git push USB_G --tags
fi

目的是将所有分支和所有标记推送到USB存储库(如果存在且位于何处)。 (-d标志检查是否存在git存储库目录,条件代码仅在目录存在时才执行。)

最初的问题是:我每个人都有一些本地分支。我不想将这些分支发送到远程服务器,只需将它们保存在本地。 如何同步 ...

push -all push -tags 命令执行此同步,确保将所有分支和标记推送到USB存储库,即使是新的USB存储库没有意识到。没有默认掌握或需要知道分支的名称并逐一处理它们。

我将其用于备份目的,因此我只展示了事物的推动力,并减少了项目和存储库的数量。实际上,我将多个项目备份到多个位置,但这只是重复的USB项目。

另一件相当明显的事情,但我没有提到,是为了同步PC A和PC B,你需要

1. sync PC A and the USB device
2. sync PC B and the USB device
3. sync PC A and the USB device again!

或者以不同方式查看,请转到

PC A -> USB -> PC B
PC B -> USB -> PC A

所以最终两台机器上的分支和标签是相同的。