git fetch && git reset --soft不更新提交记录

3
我希望能够编写一个非常简单的git脚本,每隔10分钟通过cron更新我的github仓库,以便我的bug跟踪系统可以捕捉到这些更改。
在创建该脚本之前,我进行了裸克隆,因为这并不是一个工作区,而只是为我们的问题跟踪系统(Redmine)服务。裸克隆运行良好,当我们进入问题跟踪器时,我们可以轻松地查看所有提交。
git clone --bare git@github.com:yoyodyne/coolproject.git coolproject.git 

我希望通过cron定时更新这个存储库,方法如下:

#!/bin/sh
export GIT=/opt/bitnami/git/bin/git
cd /var/redmine/git_repositories/coolproject.git && $GIT fetch 
  && $GIT reset --soft

但是当cron运行时,它不会更新新的提交并返回以下消息:

From github.com:yoyodyne/coolproject
* branch            HEAD       -> FETCH_HEAD

我之前在其他项目中使用过这种方法,完全有效。实际上,我将这种方法作为以前项目的模板。我已经彻底阅读了下面的链接,但仍然一无所获。

http://www.redmine.org/projects/redmine/wiki/RedmineRepositories

http://gitref.org/remotes/


你不需要重置,因为裸仓库没有工作树或索引相关联。 - knittl
为什么Redmine文档告诉我要这样做?那只是复制粘贴。文档不好吗?正在研究您的建议,将报告结果。 - Clay Graham
当我尝试git checkout master时,出现错误(这就是我认为你所说的“ref”的意思)。致命错误:此操作必须在工作树中运行。 - Clay Graham
光秃秃的克隆库不允许使用 git pull 命令。 - Clay Graham
4个回答

3
我不知道为什么文档建议在裸仓库中执行git reset,因为git reset在裸仓库中无效(即使--soft实际上并不更改索引或工作树),如果它起作用,那么它将是一个空操作
最简单的方法是设置一个获取规则,以镜像所有分支和标签。
git config remote.origin.fetch +refs/heads/*:refs/heads/*
git config --add remote.origin.fetch +refs/tags/*:refs/tags/*

然后,简单的git fetch命令将以类似于使用git clone --bare --mirror设置克隆库时的方式更新此克隆库中来自远程仓库的所有分支和标签。


真是个厉害的传奇啊。正是我需要的,这样可以省去我当前(由于某些原因拥有一堆&&符号...)的烦人的crontab行了。1UP - nevelis

1

你正在处理一个裸仓库。不要使用 reset 命令。使用 git checkout ref -- . 或者 git archive 命令会更好。

如果你指定工作树和 Git 仓库,也可以使用 reset 命令。这是设置环境变量的替代方法。这些选项都可以在 git 命令本身中使用。


当我尝试git checkout master时,出现错误(这就是我认为你所说的“ref”的意思)。致命错误:此操作必须在工作树中运行。 - Clay Graham
checkout 对于裸仓库和 reset 一样无效。你必须使用 git symbolic-ref HEAD 来改变裸仓库中的 HEAD,但这并不能真正解决问题。 - CB Bailey

1

所以我进行了大量搜索,发现了一篇关于引用无法工作的晦涩帖子。

https://github.com/koppen/redmine_github_hook/issues/10

#!/bin/sh
export GIT=/opt/bitnami/git/bin/git
cd /var/redmine/git_repositories/welocally-places.git && 
  $GIT fetch origin '+refs/heads/*:refs/heads/*' && $GIT reset --soft

我修改了我的脚本,它可以工作了,唯一让我感到难过的是,我觉得自己像一个模仿奇怪无毛猿的猴子。


你可以(而且应该)放弃使用 reset --soft。这没有任何作用。此外,您可以调整存储库的配置,以便在使用无参数获取时默认使用该 refspec。 - CB Bailey

0

你想使用

git clone --mirror

使用非裸仓库,让 git-fetch 按照你的期望工作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接