2

我们使用 Git 来管理和部署代码。我在 Ops 团队,负责部署。我们的开发人员进行更改并将代码推送到 Github,我们(Ops)使用一些托管流程来提取生产代码并进行部署。

过程是这样的:

背景

  • 开发人员做事。这些东西最终出现在 Github 中,开发人员告诉我们是这样的。
  • 我们有一个本地“登台”克隆和一个本地“部署”裸 git 存储库。本地 git clone 有两个遥控器,Github 为“origin”,本地裸仓库为“deploy”
  • 我们在 Web 服务器上使用 chef 通过从“deploy”远程提取的 chef git 资源实际部署代码
  • 我们有“部署”遥控器,因此在开发完成的东西和我们的部署时间之间有一个门控机制。(而不是直接从 Github 部署)

实际部署过程

  1. cd into local clone
  2. git checkout branchname
  3. git pull origin branchname
  4. git push deploy branchname

所有这些都是部分自动化的,并且正在转向完全自动化。因此,我们小心不要对暂存克隆进行本地更改,并且我们希望该git status克隆的输出只会是nothing to commit (working directory clean)

但是,本周我们收到了一条奇怪的消息。部署克隆声明它提前 80 次提交!即使它也说nothing to commit

# On branch branchname
# Your branch is ahead of 'origin/branchname' by 80 commits.
#
nothing to commit (working directory clean)

最后,本身并没有真正的问题。此克隆中的提交 SHA256 哈希匹配,以及所有 Web 服务器上部署的代码。我没有进行实际的 rsync 比较,但我非常有信心实际代码本身已正确部署。

我想知道这是怎么发生的,如果它很糟糕,以及如何在不删除本地克隆并重新开始的情况下清理它。

4

2 回答 2

1

如果deploylocalrepos 都从同一个 ' origin' (GitHub) 克隆,您的过程显示 onlylocal正在执行git pull origin.

存储库deploy从不从中获取任何东西origin(它只接收来自 的提交local)。
这意味着deploy仍然相信提交不会在起源上(至少它知道的起源)。从 repo 中执行
的简单操作将使该状态更清晰。git fetch origindeploy

于 2013-02-12T15:12:09.090 回答
0

发生这种情况可能有多种原因,例如origin/branchname已重置为先前的提交,或者有人another_repo/branchname错误地在本地存储库中提取了一个。但是,您似乎误解了该消息的实际含义。

想象一下以下提交:

A -- B -- C -- D                origin/branchname
      \         \
        E ------ F -- G -- H    branchname

现在,如果您还没有触及本地存储库,那么显然它是干净的并且您会收到nothing to commit (working directory clean)消息。但是,branchname确实领先origin/branchname3 次提交。这仅仅意味着您在当前分支中有 3 次提交在origin/branchname. 当然,仍然没有什么可承诺的!(虽然有什么要推动的。这两个是不同的)

这是发生这种情况的一种可能情况:

                  E -- F        origin/otherbranch
                /       \
A -- B -- C -- D         \      origin/branchname
                \         \
                 --------- G    branchname

如果您(例如错误地)说过:

git checkout branchname
git pull origin otherbranch

然后你有 2 个提交branchnameorigin/branchname.

同样,您需要更多分析才能知道到底发生了什么。也许agit log --pretty=oneline --graph会帮助找到问题。完成此操作后,您可以尝试重置回正确的先前状态。

于 2013-02-12T15:20:16.987 回答