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

标签 git branch tracking

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

git branch -t 0.1 origin/0.1

这似乎是我在那个时间点需要做的事情。但是,如果我对 origin 进行更改,然后使用裸仓库获取,事情就会开始崩溃。我的工作流程如下所示:

git fetch origin

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

git diff 0.1 refs/remotes/origin/0.1

我需要做什么才能让我的跟踪分支更新到 Remote 的更新?我觉得我一定是在某处遗漏了一步或一面旗帜。

更新:补充说明

Normally one would push into a bare repository, rather than run git fetch from within it. If you can arrange to do that, life will be much easier.

这里是对工作流程的一些说明。

该项目的公共(public) git 存储库托管在 GitHub 上。我正在使用 Redmine 管理项目(wiki、问题、论坛)。 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/*

+ 意味着这将用远程分支的状态覆盖本地分支的状态。没有 +,不是快进 merge 的更新将被拒绝。但是,如果这只是一面镜子,那应该无关紧要。 (您可以通过将配置变量 remote.origin.fetch 设置为 +refs/heads/*:refs 来将其配置为 git fetch origin 的默认操作/heads/*。如果你也想从源镜像标签和远程跟踪分支,你可以使用 +refs/*:refs/*。)

但是,如果像你最初要求的那样,你想维护远程跟踪分支并有选择地将它们 merge 到本地分支,你可以使用以下步骤,但我不一定推荐它们,除非你是唯一的人使用这个裸存储库。 (注意:我最初在这里建议使用“git symbolic-ref HEAD refs/heads/whatever”来切换分支,使用“git reset --soft”来更改分支引用 - 然而,Charles Bailey 在评论中指出可以使用“git update-ref refs/heads/whatever refs/remotes/origin/whatever”,这不需要先切换分支。)

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

  1. 你可以通过比较 git merge- base master origin/mastergit show-ref master - 它们应该相同。或者您可以在 this question 中使用 is-ancestor 脚本,它通过一些额外的检查来执行这些命令。)
  2. 最后,您可以使用 git update-ref refs/heads/master 更新当前分支(在本例中为 master)以指向 origin/master refs/remotes/origin/master

但是,正如我在开头所说,我想您想要的真正解决方案是:

  • 改为推送到您的裸存储库或
  • 像我上面描述的那样精确地镜像远程裸仓库

希望对你有用。

关于git - 如何让远程跟踪分支与裸 Git 存储库中的远程源保持同步?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4698649/

相关文章:

git - 分支策略 - 维护多个版本

javascript - 最好的网站光标(鼠标)跟踪应用程序是什么?

python - OpenCv 3.1.0 中的 KCF Tracker - 无输出,无错误报告

events - 谷歌分析事件跟踪不起作用?

git - 如何在 GitHub 中恢复已删除的 fork ?

git - 有什么办法可以通过git log实现Graph by Branch的功能吗?

git - 始终推送到远程的不同分支,而不设置上游

svn - 使用 Maven 从标签创建分支

git - 为什么 git 接受以哈希符号开头的提交消息

tfs - 文件夹转换为分支?