git - 从裸远程仓库克隆时缺少提交

标签 git git-bare

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

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

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

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

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

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

git clone -b BRANCHA http://pathto/repo.git

克隆的 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

如果我执行 git pull已经是最新的了。

为什么当我克隆时,我最终得到的是提交 07260c9,而不是提交 9c9b880,为什么 pull 不会降低那些后来的提交?我是否遗漏了一些关于远程裸仓库应该如何工作的信息,或者我应该以不同的方式推送到裸仓库?

最佳答案

支持@Chronial 为我指明正确的方向...

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

git update-server-info

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

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

#!/bin/sh

exec git update-server-info

关于git - 从裸远程仓库克隆时缺少提交,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17282952/

相关文章:

linux - 如何计算远程 git 存储库的总行数

git - 使用 git 管理生产网站?

python - 通过 Python 中的 Git 钩子(Hook)更新 Git 存储库

git - 编写一个 git post-receive hook 来处理特定的分支

git - 在裸 git-svn 中跟踪一个分支

git - 获取裸存储库的工作副本

Git Bash (mintty) 在 Windows 10 操作系统上速度极慢

git - 我怎样才能让 git log 在一行上打印每个提交的完整哈希和简短统计信息?

git - 同步上游提交时如何在Git中清理提交历史?

python - 无法同步数据库 “DatabaseError: no such table: django_site”