镜像git非裸存储库

时间:2017-09-25 16:15:37

标签: git repository workflow

我需要一个"机器人用户"通过一些脚本与git bare远程存储库交互。这个裸仓库被称为中央仓库。

这次,这个机器人用户有自己的本地存储库,它不是一个裸存储库(他必须签出分支,合并分支,......)。但是每天晚上,当他醒来工作时,他需要在当地拥有一个完美的中央仓库镜像(除了主人之外的每个分支都可以进化,一些新的分支可以创建,......)。

最好的方法是什么?

2 个答案:

答案 0 :(得分:1)

不幸的是,这并不像之前的回答所说的那样简单,因为git pull只将更改合并到当前分支中。

你的机器人需要做的第一件事是git fetch - 虽然git pull(默认情况下)会导致这种情况发生,但我建议直接执行fetch避免可能混淆的副作用。

执行fetch时,获得的内容取决于remote.central.fetch配置选项(对于您指定的名为central的远程)。 clone后的默认设置(假设您未向mirror指定single-branchdepthno-single-branch clone之类的内容command ...)将获取所有分支的历史记录,并更新远程分支引用(例如refs/origin/central/master以指示mastercentral分支的条件。

如果您坚持使用,那么您的本地参考仍然与遥控器不同步。这是否是一个问题取决于您的机器人正在做什么。这里有很多排列......你的机器人可能会在fetch之前进行本地更改,如果是这样,你想用它们做什么?您的机器人会在fetch之后进行更改吗?最终它会推动这些更改吗?加上任何数量的“如果你想让历史看起来像X,做Y”的考虑。

我会说,如果您的意图是移动所有本地分支以反映central上的相应分支,则有两种基本方法:

1)将refspec保留为默认设置,然后迭代更新本地引用的分支以匹配远程。这使您有机会处理任何本地更改(通过将它们合并或重新定位到分支历史记录中),但需要相当多的脚本。

2)将refspec更改为与镜像克隆相似。 (我理解这就是你所得到的,你如何表达这个问题。)这可能是有风险的,因为局部变化可能会被破坏,你仍然需要识别{{1上已删除的任何分支}}。这里的设置类似于

central

答案 1 :(得分:0)

这很简单(如果用完美的镜子你的意思是all branches, but not other refs)。

克隆没有--bare的裸仓库会产生正常的仓库。完成这一次后,您的机器人只需

git pull

他上班的时候。