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