将Git仓库复制到离线机器,通过存储设备进行推送/拉取

19

我需要在离线的机器上工作,无法访问我的存储库。但我不想完全放弃使用Git。

问题:

  • 通过存储设备将存储库复制到离线机器的最佳方法是什么?
  • 是否有一种通过文件系统复制补丁的方法?

编辑:我应该声明,我必须把存储设备交给管理员进行复制,即我不能用我的用户挂载存储设备。

3个回答

17
要复制完整的Git仓库,只需复制文件夹.git;它包含了一切。Git使用安全文件名并忽略仓库内部的时间戳,因此这些数据不受通常的文件系统问题的影响。
在目标机器上创建一个文件夹,将.git文件夹复制到其中。现在,git checkout <branch>将让您得到一个工作副本。
如果您想要来回移动补丁而不是整个仓库,则git format-patch <branch>会创建它们。该命令将创建更新远程仓库所需的所有补丁(即输出将包含尚未推送的所有内容)。您还可以给它提交ID(=从此提交开始)或范围。
要应用它们,请在远程仓库上使用git am < 0001....
相关链接:

好建议。在初始复制之后,您可以使用 format-patch 并将补丁发送到自己的电子邮件中,以避免涉及系统管理员来保持离线存储库同步。 - drRobertz

7

如果您需要将存储库复制到存储器棒中,只需使用git clone命令,然后使用git pull命令进行更新。

例如,在您的在线计算机上,挂载存储器棒后,请执行以下操作:

cd <memory-stick-mount-point>
git clone <local-path-to-git-repo>

现在,<local-path-to-git-repo> 将成为您的 USB 硬盘上仓库的 origin 远程存储库, 因此,在您将其挂载到在线机器时,您只需使用 git push/pull 即可同步离线工作。
内存棒上的 git 仓库是自包含的,因此您现在可以在任何计算机上使用它,并在挂载到在线机器时像上面那样进行同步。
关于不能自己挂载存储设备的问题,请参见以下编辑:
如果您可以请求管理员将存储库克隆到内存棒中,则可以这样做。否则,您的管理员可以将整个项目 .git 目录(如果是裸仓库)或 project/.git(否则)复制到您的存储设备中,然后您可以使用它进行工作,要注意的是 remote 等内容将会是在线机器上的。
然后,拉取不是问题,但如果您不信任系统管理员来解决合并冲突,则需要进一步解决推送问题。 如果您有自己的分支,则合并不是问题。 否则,要在“离线”之前执行合并,则可能需要两个离线副本,一个是您正在使用的副本,另一个是您的“origin”,当您回来时,请管理员从“origin”存储库进行 git pull,然后在离线计算机上,在这两个内存棒仓库之间执行合并,然后请管理员将您的 origin 存储库合并到在线存储库中。
虽然这种方式感觉有些脆弱且容易出现竞争条件,但我确实建议在“离线”之前创建单独的分支。

我应该解释一下,我不能自己挂载这个存储设备。我需要向管理员请求将内容复制到本地文件系统中。这会影响 Git 仓库吗? - Beginner
已根据更新的答案进行了修改。但是Aaron的答案更为简洁。请注意,包含裸仓库的目录与带有工作目录的仓库中的.git目录相同。 - drRobertz
1
不,每个仓库都是完整的。您可以使用pull从一个仓库推送更改到另一个仓库,反之亦然。 - Jepessen
2
是的,我只是想强调一个裸仓库不会有一个名为.git的目录,它就是.git目录但可以有任何名称。 - drRobertz

7
命令git bundle就是为此设计的。例如,要在离线状态下克隆存储库的主分支。
cd my-repository
git bundle create offline-repos master

这将会把整个master分支存储在名为offline-repos的文件中。拷贝该文件到另一台电脑。在那台电脑上,输入以下命令:

git clone -b master offline-repos new-repos

这将创建名为new-repos的文件夹,并从offline-repos检出。您克隆的捆绑文件将被视为远程存储库。您甚至可以创建一个捆绑文件来存储自某个ref以来的更改,例如:

git bundle create offline-repos e45ad329..master

如果您将捆绑文件offline-repos替换为包含新更改的捆绑文件,则可以进行git pull操作,例如:

cd new-repos
git pull

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接