4

我在 github.com 上有一个存储库,我将它 git 拉到我的工作站,编辑,提交,然后 git 将更改推送回 github。这一切都很好。

但我经常使用例如从 github.com 克隆只读副本:

git clone git://github.com/jhsrennie/Test.git Test-ro

通常这是因为我有临时测试安装,我不会在上面开发,但我需要检查代码构建和运行。我的 github 存储库的副本可以是只读的,因为不需要将任何更改推回 github。问题是,当我使用以下命令将更改从 github 下拉到我的只读副本时:

git pull origin master

我现在发现 git status 显示如下:

$ git status
# On branch master
# Your branch is ahead of 'origin/master' by 1 commit.
#   (use "git push" to publish your local commits)

我无法将更改推回,而且我也不想这样做,但是未完成的提交给我带来了问题,例如我无法签出新的远程分支。我最终不得不删除我的只读存储库并在每次需要更新时重新克隆它。

如何从 github.com 更新我的 github 存储库的只读副本,而不会让他们认为有我需要推送的提交?

或者,我这样做是不是很愚蠢,有没有更好的方法来实现我的目标?

回应纸杯蛋糕的回答

这对我来说也很奇怪,显然我缺少一些东西。这是重现问题的方法:

  • 使用以下命令克隆存储库:git clone git@github.com:jhsrennie/Test.git Test-rw
  • 克隆只读副本:git clone git://github.com/jhsrennie/Test.git Test-ro
  • 更改Test-rw, thengit addgit commit

git status现在显示(如您所料):

renniej@RATHAUS /d/Dev/GIT/Test-rw (master)
$ git status
# On branch master
# Your branch is ahead of 'origin/master' by 1 commit.

最后,我将更改推送到 githubgit push origin master

现在切换到只读副本并检查是否git status显示:

renniej@RATHAUS /d/Dev/GIT/Test-ro (master)
$ git status
# On branch master
nothing to commit, working directory clean

使用更新它git pull origin master,我得到(这是对单个文件 README.md 的更改):

renniej@RATHAUS /d/Dev/GIT/Test-ro (master)
$ git pull origin master
remote: Counting objects: 5, done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 3 (delta 0), reused 3 (delta 0)
Unpacking objects: 100% (3/3), done.
From git://github.com/jhsrennie/Test
 * branch            master     -> FETCH_HEAD
Updating 76b02d1..5b03266
Fast-forward
 README.md | 2 ++
 1 file changed, 2 insertions(+)

现在git status给出:

renniej@RATHAUS /d/Dev/GIT/Test-ro (master)
$ git status
# On branch master
# Your branch is ahead of 'origin/master' by 1 commit.

我能想到的唯一解释是只读副本无法识别更新来自最初克隆的同一存储库,但这至少可以说似乎很奇怪。

4

2 回答 2

6

发生的事情是远程跟踪分支origin/master没有更新。如果您阅读手册页,这是使用参数调用git-pull时的记录行为:git pull

A parameter <ref> without a colon is equivalent to <ref>: when pulling/fetching, so it merges <ref> into the current branch without storing the remote branch anywhere locally

简单的解决方法是确保master设置为 trackorigin/master,然后不带参数调用git pull,这会为您更新远程跟踪分支。

如果您已经运行git pull origin master并需要更新origin/masterref,请使用git fetchor git remote update

于 2013-08-05T19:33:53.833 回答
0

正如Pikrass 指出的那样,消息

$ git status
# On branch master
# Your branch is ahead of 'origin/master' by 1 commit.
#   (use "git push" to publish your local commits)

告诉您您有一个不存在于remote/master. master您可以简单地将本地硬重置为与以下位置相同,而不是删除整个 repo 并重新克隆origin/master

$ git reset --hard origin/master

但是,从您提供的信息来看,如果您所做的master只是.origin/mastergit pull origin master

此外,如果您已经拥有测试存储库的本地副本,而不是从 GitHub 克隆新的测试存储库,您可以简单地在本地进行更多克隆,这会更快,因为它不必通过网络下载存储库:

$ git clone <directory path to local repo> <new clone name>

但是,如果没有额外的配置,这个新的克隆将把它从克隆的本地仓库设置为origin,所以它不会是只读的,并且如果你从新的克隆推送,它可以覆盖原始克隆中的更改。

于 2013-08-05T17:41:50.973 回答