繁体   English   中英

如何让远程跟踪分支在裸Git存储库中与远程源保持同步?

[英]How do I get a remote tracking branch to stay up to date with remote origin in a bare Git repository?

我正在尝试维护一个Git存储库的裸副本,并且有一些问题使远程跟踪分支保持最新。 我创建这样的远程跟踪分支:

git branch -t 0.1 origin/0.1

这似乎做了我需要做的事情。 但是,如果我对origin进行更改然后使用裸回购获取,则事情开始分崩离析。 我的工作流程如下:

git fetch origin

看起来所有的提交都在那时进行,但我的本地副本0.1没有更新。 我可以通过执行以下操作看到更改已进入存储库:

git diff 0.1 refs/remotes/origin/0.1

我需要做什么才能使用远程更新更新我的跟踪分支? 我觉得我必须在某个地方错过一步或一面旗帜。

更新:附加说明

通常情况下,人们会进入裸存储库,而不是从内部运行git fetch。 如果你可以安排这样做,生活会更容易。

以下是对工作流程的一些澄清。

该项目的公共git存储库托管在GitHub上。 我正在使用Redmine管理项目(维基,问题,论坛)。 Redmine需要一个本地裸存储库才能运行。 当GitHub收到更改时,它会ping Redmine。 Redmine然后尝试从其原点(GitHub)获取更改。

如果我只是与master合作但是它不能与我的跟踪分支机构合作,那么这很有用。 这些更改正在导入,但未在Redmine存储库浏览器的分支中列出,因为本地分支未进行更新。

我确信我可以通过另一种方式解决这个问题,但是找到(通用)解决方案来启动和运行跟踪分支绝对是我的偏好,因为Redmine的大多数git相关插件都假设“git fetch origin”之类的东西都是这需要做。

请参阅已接受的答案以获取完整的解 - --mirror解决方案似乎正是这种情况下所需要的。

通常情况下,人们会进入裸存储库,而不是从内部运行git fetch 如果你可以安排这样做,生活会更容易。

如果您必须获取而不是推送,并且您只想在裸存储库中创建原始镜像,则可以避免完全使用远程跟踪分支。 如果您从头开始使用这个镜像, Charles Bailey在下面指出,如果您最初使用git clone --mirror克隆存储库,那么git将为您完成所有这些设置。

否则,您可以获得类似的效果:

git fetch origin +refs/heads/*:refs/heads/*

+表示这将覆盖来自远程分支的本地分支的状态。 如果没有+ ,将拒绝不是快进合并的更新。 但是,如果这只是一面镜子,那应该不重要。 (您可以将此配置为git fetch origin的默认操作,方法是将config变量remote.origin.fetch设置为+refs/heads/*:refs/heads/* 。如果要镜像标记和远程跟踪分支也可以使用+refs/*:refs/*来代替。)

但是,如果您最初要求维护远程跟踪分支并有选择地将它们合并到本地分支中,则可以使用以下步骤,但我不一定会推荐它们,除非您是唯一使用此分支的人库。 (注意:最初在这里我建议使用“git symbolic-ref HEAD refs / heads / whatever”切换分支和“git reset --soft”来改变分支参考 - 但是, Charles Bailey在评论中指出一个人可以使用“git update-ref refs / heads / whatever refs / remotes / origin / whatever”,这不需要先切换分支。)

首先,您可能想要检查更新分支是否是快进合并,然后更新分支。 请注意,这里存在竞争条件,这就是为什么我说如果你是唯一一个使用本地裸存储库的人,你应该这样做 - 如果其他人在这些步骤之间的分支上移动,那么检查将毫无用处。

  1. 您可以通过比较git merge-base master origin/mastergit show-ref master来检查等效合并是否是快进(即origin/master的历史包括master ) - 它们应该是相同的。 或者你可以在这个问题中使用is-ancestor脚本,它通过一些额外的检查来执行这些命令。)
  2. 最后,您可以更新当前分支( master在这种情况下)为指向origin/mastergit update-ref refs/heads/master refs/remotes/origin/master

但是,正如我在开始时所说,我想你想要的真正解决方案是:

  • 反而推入你的裸存储库或
  • 正如我上面所描述的那样,完全镜像远程裸存储库

我希望有一些用处。

当你fetch ,远程更改正在更新你自己的远程本地引用, origin/0.1 (这不会导致任何冲突,因为origin/0.1从不托管任何本地更改)。 要导入这些更改,您可以从0.1 git reset refs/remotes/origin/0.1 ,这将使HEAD分支( 0.1 )指向与远程分支相同的提交。

请注意,通过这样做,您将失去对来自遥控器的0.1任何更改。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM