从裸远程仓库克隆时丢失提交

row*_*att 3 git git-bare

我有一个小的 PHP 库,我编写它来支持各种 Web 项目。这些项目都在 git 中,库是每个 repos 的子模块。Web 项目使用 git push 部署,部署脚本需要访问库子模块 repo 以更新库。

有时对于任何给定的项目,库都会有自己的分支,直到我将这些更改合并回主分支。

我已经为该库设置了一个裸远程仓库,并且能够将库子模块推送到远程仓库。效果很好,我可以在远程仓库中看到这些提交。但是,当我尝试部署时,找不到这些提交。事实上,如果我自己克隆远程仓库,我找不到那些提交。

例如,远程仓库看起来像这样:-

git log --graph --oneline --date-order

* 9c9b880 (BRANCHA)
* e88ee92
* 07260c9
* 40b0963
*   35b6533 (tag: dev/0.0.2, master) Merge branch 'refs/heads/development'
|\  
| * ba3c1bd (HEAD, development)
| * eefa611
| *   1b87828 Merge branch 'refs/heads/BRANCHB' into development
| |\  
| | * 9078c1c (BRANCHB)
| |/  
| * 834e715
| * a000cd7
|/  
* 5985fc9 Initial commit
Run Code Online (Sandbox Code Playgroud)

但是,如果我按如下方式克隆远程仓库:-

git clone -b BRANCHA http://pathto/repo.git
Run Code Online (Sandbox Code Playgroud)

克隆的 repo 看起来像:-

git log --graph --oneline --date-order

* 07260c9 (HEAD, origin/BRANCHA, BRANCHA)
* 40b0963 
*   35b6533 (tag: dev/0.0.2, origin/master) Merge branch 'refs/heads/development
|\  
| * ba3c1bd (origin/development, origin/HEAD)
| * eefa611
| *   1b87828 Merge branch 'refs/heads/BRANCHB' into development
| |\  
| | * 9078c1c (origin/BRANCHB)
| |/  
| * 834e715
| * a000cd7
|/  
* 5985fc9
Run Code Online (Sandbox Code Playgroud)

如果我这样做,git pull我是Already up-to-date.

为什么当我克隆时,我最终会提交 07260c9,而不是提交 9c9b880,为什么不拉取那些后来的提交?我是否缺少有关远程裸存储库应该如何工作的信息,还是应该以不同的方式推送到裸存储库?

row*_*att 5

为@Chronial 指明正确方向的道具...

事实证明,ssh 上的 git 与 http 上的 git 并不完全相同。也许 git-fu 专家可以解释原因,但解决方法很简单。在远程仓库上:-

git update-server-info
Run Code Online (Sandbox Code Playgroud)

使通过 http 获取的 repo 与 repo 的当前状态(通过 ssh 获取)同步。

似乎这必须在每次推送到远程仓库后运行,但这就像将post-update.samplerepo 的 hooks 目录中的文件重命名为 一样简单,post-update每次推送后都会运行以下脚本:-

#!/bin/sh

exec git update-server-info
Run Code Online (Sandbox Code Playgroud)

  • http 和 ssh 的区别在于,git-http 是“转储”,而 git-ssh 是“智能”。这意味着使用 git-ssh 客户端和 repo 将进行对话,客户端可以提出诸如“你的分支是什么,它们在哪里?”之类的问题。另一方面,使用 http,git 可以只下载那里的静态文件(以及 **not** 列表目录)。因此 git-http 需要一个文件,其中包含有关分支的基本信息。`git update-server-info` 提供了这一点。你可以通过运行 `git help update-server-info` 并查看 `.git/info/refs` 来获取更多信息。 (2认同)