【问题标题】:Git clone --bare / fetchgit clone --bare / fetch
【发布时间】:2012-11-07 08:29:12
【问题描述】:

我有一个历史悠久而奇怪的 git 存储库。我不知道开发人员对这个存储库做了什么,也无法控制他们现在用它做什么。

但我需要克隆这个存储库(用于 redmine 集成)并定期获取所有更改。

我该怎么办:

git clone --bare git@git.server.com:/opt/git/repo
cd repo.git
git log

现在我可以看到所有提交。很好。

接下来,开发人员在主存储库中进行提交,我想获取所有更改(所有分支、标签等):

> git fetch --all 
Fetching origin
remote: Counting objects: 18, done.
remote: Compressing objects: 100% (14/14), done.
remote: Total 14 (delta 5), reused 0 (delta 0)
Unpacking objects: 100% (14/14), done.
From git.gmcs.ru:/opt/git/ecco
 * branch            HEAD       -> FETCH_HEAD

但是如果询问提交历史,我没有看到在主存储库中进行的最后一次提交。为什么?

如果我发布的信息不足,我已经准备好为您提供所有需要的信息。

提前致谢。

更新

这是原始存储库中的一个分支信息:

git branch -a
  one
  test
* master
  release

这里是克隆仓库中的一个分支信息:

git branch -a
  one
  test
* master
  release

我可以在原始存储库的主分支中看到最后一次提交,但在克隆存储库的主分支中找不到它们。

【问题讨论】:

  • fatal: /usr/lib/git/git-pull 不能在没有工作树的情况下使用。我认为这是因为它是一个裸存储库。

标签: git


【解决方案1】:

为了获取更多更新到一个裸仓库,我这样做:

git config remote.origin.fetch 'refs/heads/*:refs/heads/*'

那我可以做:

git fetch

【讨论】:

  • 这是最好的答案。获取 intogit clone --bare 创建的 repo 的问题的所有其他答案都没有为我解决。符号引用解决方案不是很好,因为每次都必须为每个分支都这样做,这是不可取的。
  • 如果你使用git fetch -p,它会额外修剪已经从原点移除的分支。
【解决方案2】:

你应该使用git pull

或在 fetch 后运行 git merge 以获取获取的更改

如果你有一个裸仓库,你不能做拉取,因为拉取想要与 HEAD 合并,而裸仓库没有。

要更新裸存储库,您可以将其作为remote 添加到非裸存储库并推送到它。

但我认为 --mirror 而不是 --bare 将按原样为您工作。

与 --bare 相比,--mirror 不仅映射本地分支 源到目标的本地分支,它映射所有参考(包括 远程分支、注释等)并设置一个 refspec 配置,例如 所有这些 refs 都被 git 远程更新覆盖 目标存储库。

然后你可以使用git remote update更新镜像仓库

【讨论】:

  • fatal: /usr/lib/git/git-pull 不能在没有工作树的情况下使用。我认为这是因为它是一个裸存储库。
  • 对不起,可能是,你需要裸仓库吗?
  • 是的,因为我看到 Redmine 需要一个裸存储库。此外,此方法适用于所有其他存储库,有点我无法弄清楚此存储库有什么问题。
【解决方案3】:

要获取到您的裸存储库,请先定期配置

git config remote.origin.fetch "+*:*"

然后简单地运行

git fetch --prune

获取所有更改,包括标签、新分支甚至分支删除(选项--prune)。

  • 还请注意上述命令中的双引号 (") 以保护 asterix (*) 不被您的 shell 解释。
  • 需要加号才能允许非快进更新。如果您想备份遥控器的当前状态,这可能是您的意图。
  • 注意:使用此配置不会提取标记删除。

另见https://stackoverflow.com/a/33461528/4138912

【讨论】:

    【解决方案4】:

    您可以使用git symbolic-ref 更新裸存储库的HEAD,例如从远程origin 指向分支master

    $ git symbolic-ref HEAD refs/remotes/origin/master
    

    如果您使用git fetch 更新遥控器,它将更新例如origin/master。所缺少的只是重新指向克隆的HEAD

    【讨论】:

    • 我试过了,但得到了:git log -> fatal: bad default revision 'HEAD'
    猜你喜欢
    • 2016-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-17
    • 2011-11-06
    • 1970-01-01
    • 2012-08-10
    相关资源
    最近更新 更多