在没有互联网连接的两个本地设备之间同步 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 通信的 macjetson 上的存储库?

如果您不需要目标端存储库的完整历史记录,您可以考虑 git archive instead of git bundle

这样一来,您只有一个文件(存档)可以 rsyncscp 结束,然后解压缩。

如果你有 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 在 macjetson 上的工作目录与 jetson 上的裸仓库之间同步代码更改。但是,这两个工作目录之间的同步需要在两台机器上执行一个命令。

每次推送到 master 分支都会立即检出到 jetson 上的 deploydir,这可能有助于将更改部署到代码执行的位置。