在没有互联网连接的两个本地设备之间同步 git 存储库
Sync a git repository between two local devices without internet connection
我在 github 上有一个存储库 repo
,我在本地系统 (mac
) 上有它的克隆,我每天用它来进行编辑和推送; mac
有互联网连接可以执行此操作。
但是该项目部署在 NVIDIA Jetson 设备 jetson
上,该设备无法始终访问互联网连接。 (这是因为我已禁用 dhcp 为其 eth0
接口提供静态 IP。)为了部署和测试,我使用各种 ssh
工具将代码从 mac
迁移到 jetson
.
如何同步仅通过 ssh
通信的 mac
和 jetson
上的存储库?
如果您不需要目标端存储库的完整历史记录,您可以考虑 git archive
instead of git bundle
。
这样一来,您只有一个文件(存档)可以 rsync
或 scp
结束,然后解压缩。
如果你有 git
在 jetson 上可用,并且如果 git push jetson master
看起来是将 repo 推送到 jetson 设备的理想方式,你可以使用 server-side git钩子。
此建议假定您要编辑 mac
上的存储库并希望将更改推送到 jetson
以进行部署。我们假设您想将回购协议的主分支部署到 jetson 上的 /home/user/project/deploydir
。
为此,请在 jetson
:
上创建 deploydir
以及裸 git 回购
# create the remote deploydir
mkdir -p /home/user/project/deploydir
# create the remote repo
git -C /home/user/project init --bare repo
接下来您需要在 jetson
:
上设置 server-side git 挂钩
touch /home/user/project/repo/hooks/post-receive
chmod +x /home/user/project/repo/hooks/post-receive
nano /home/user/project/repo/hooks/post-receive
将以下内容粘贴到 nano 中的 post-receive
挂钩脚本中。基本上,这将确保如果您将新的 master
ref 推送到 repo,它将被检出到 deploydir
:
#!/bin/bash
while read oldrev newrev ref
do
if [[ $ref =~ .*/master$ ]];
then
echo "Master ref received. Updating local work-dir ..."
git --work-tree=/home/user/project/deploydir --git-dir=/home/user/project/repo checkout -f
else
echo "Ref $ref successfully received; Not in master branch, so nothing to do."
fi
done
之后 mac
:
# Add the remote to the git repo:
git remote add jetson user@hostname:/home/user/project/repo/
# Push the master branch to jetson
git push jetson master
# Push the master branch to origin
git push origin master
最后一条语句假定您已经在您的存储库中定义了一个远程 origin
,它指向您的 Github 存储库。
更新:
更新,正如您在评论中指出的那样,jetson
上会有代码更改:
在这种情况下,您可以将 jetson 上的 repo 克隆到 jetson 上的本地工作目录:
cd /home/user/project
git clone /home/user/project/repo /home/user/project/workdir
现在,您在 jetson
上有一个本地工作目录,您可以在其中更改代码并 push/fetch/pull 到裸仓库。
您可以通过 pushing/fetching/pulling 在 mac
和 jetson
上的工作目录与 jetson
上的裸仓库之间同步代码更改。但是,这两个工作目录之间的同步需要在两台机器上执行一个命令。
每次推送到 master 分支都会立即检出到 jetson
上的 deploydir
,这可能有助于将更改部署到代码执行的位置。
我在 github 上有一个存储库 repo
,我在本地系统 (mac
) 上有它的克隆,我每天用它来进行编辑和推送; mac
有互联网连接可以执行此操作。
但是该项目部署在 NVIDIA Jetson 设备 jetson
上,该设备无法始终访问互联网连接。 (这是因为我已禁用 dhcp 为其 eth0
接口提供静态 IP。)为了部署和测试,我使用各种 ssh
工具将代码从 mac
迁移到 jetson
.
如何同步仅通过 ssh
通信的 mac
和 jetson
上的存储库?
如果您不需要目标端存储库的完整历史记录,您可以考虑 git archive
instead of git bundle
。
这样一来,您只有一个文件(存档)可以 rsync
或 scp
结束,然后解压缩。
如果你有 git
在 jetson 上可用,并且如果 git push jetson master
看起来是将 repo 推送到 jetson 设备的理想方式,你可以使用 server-side git钩子。
此建议假定您要编辑 mac
上的存储库并希望将更改推送到 jetson
以进行部署。我们假设您想将回购协议的主分支部署到 jetson 上的 /home/user/project/deploydir
。
为此,请在 jetson
:
deploydir
以及裸 git 回购
# create the remote deploydir
mkdir -p /home/user/project/deploydir
# create the remote repo
git -C /home/user/project init --bare repo
接下来您需要在 jetson
:
touch /home/user/project/repo/hooks/post-receive
chmod +x /home/user/project/repo/hooks/post-receive
nano /home/user/project/repo/hooks/post-receive
将以下内容粘贴到 nano 中的 post-receive
挂钩脚本中。基本上,这将确保如果您将新的 master
ref 推送到 repo,它将被检出到 deploydir
:
#!/bin/bash
while read oldrev newrev ref
do
if [[ $ref =~ .*/master$ ]];
then
echo "Master ref received. Updating local work-dir ..."
git --work-tree=/home/user/project/deploydir --git-dir=/home/user/project/repo checkout -f
else
echo "Ref $ref successfully received; Not in master branch, so nothing to do."
fi
done
之后 mac
:
# Add the remote to the git repo:
git remote add jetson user@hostname:/home/user/project/repo/
# Push the master branch to jetson
git push jetson master
# Push the master branch to origin
git push origin master
最后一条语句假定您已经在您的存储库中定义了一个远程 origin
,它指向您的 Github 存储库。
更新:
更新,正如您在评论中指出的那样,jetson
上会有代码更改:
在这种情况下,您可以将 jetson 上的 repo 克隆到 jetson 上的本地工作目录:
cd /home/user/project
git clone /home/user/project/repo /home/user/project/workdir
现在,您在 jetson
上有一个本地工作目录,您可以在其中更改代码并 push/fetch/pull 到裸仓库。
您可以通过 pushing/fetching/pulling 在 mac
和 jetson
上的工作目录与 jetson
上的裸仓库之间同步代码更改。但是,这两个工作目录之间的同步需要在两台机器上执行一个命令。
每次推送到 master 分支都会立即检出到 jetson
上的 deploydir
,这可能有助于将更改部署到代码执行的位置。