保留git存储库的多个只读副本

时间:2013-08-05 17:15:22

标签: git

我在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存储库的只读副本,而不会让他们认为我需要推送提交?

或者,我是以愚蠢的方式做到这一点,是否有更好的方法来实现我的目标?

对Cupcake答案的回应

我也觉得很奇怪,而且显然我缺少了一些东西。这是重现问题的方法:

  • 使用以下内容克隆存储库:git clone git@github.com:jhsrennie/Test.git Test-rw
  • 使用以下内容克隆只读副本:git clone git://github.com/jhsrennie/Test.git Test-ro
  • Test-rw,然后git 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.

最后我用git push origin master

将更改推送到github

现在切换到只读副本并检查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.

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

2 个答案:

答案 0 :(得分:5)

正在发生的事情是远程跟踪分支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

简单的解决方法是make sure master is set to track origin/master,然后调用git pull,不带参数,这会为您更新远程跟踪分支。

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

答案 1 :(得分:0)

作为Pikrass points out,消息

$ 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重置为与origin/master相同的点,而不是删除整个仓库和重新折叠:

$ git reset --hard origin/master

但是,根据您提供的信息,如果您所做的只是master,那么您的本地origin/master就不会匹配git pull origin master,这似乎很奇怪。

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

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

但是,如果没有其他配置,这个新克隆将具有从设置为origin克隆的本地repo,因此它不是只读的,并且可以覆盖原始克隆中的更改如果你从新克隆推出。