35

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

4

4 回答 4

26

与其制作一个裸克隆,我更喜欢制作一个捆绑包(请参阅“我如何通过电子邮件向某人发送 git 存储库? ”),它生成一个文件,更容易复制(例如在 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
于 2011-02-01T08:40:31.540 回答
23

请参阅此博客文章“在没有服务器的情况下同步 Git 存储库”Victor Costan 撰写)。

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

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

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

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

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

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

git push usb

在接收端,挂载 U 盘,并使用存储库的文件 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
于 2011-02-01T08:03:59.897 回答
5

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

即将repo2从第二台计算机合并到~/repo1,首先将repo2复制到~/repo2的repo1文件系统(记忆棒,网络副本等),然后你可以使用Git的答案来拉动两个本地存储库之间的变化

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

这是有效的,因为正如git 上的维基百科文章所说:“Git 存储库——数据和元数据——完全包含在其目录中,因此整个 Git 存储库的正常系统级复制(或重命名或删除)是一种安全操作. 生成的副本既独立于原件,也不知道原件。”

于 2013-01-16T01:40:46.533 回答
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 -allpush --tags命令执行此同步,确保所有分支和标签都被推送到 USB 存储库,即使是 USB 存储库不知道的新分支和标签。没有默认master或需要知道分支的名称并一一处理。

我出于备份目的运行它,所以我只展示了事物的推送方面,并减少了项目和存储库的数量。实际上,我将多个项目备份到多个位置,但这里只有重复的 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

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

于 2015-08-07T12:32:04.487 回答