【问题标题】:Keeping multiple read-only copies of a git repository保留 git 存储库的多个只读副本
【发布时间】:2013-08-06 11:55:19
【问题描述】:

我在 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,然后更改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.

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

【问题讨论】:

  • 如果 git 告诉您在 github 的分支之前有一个提交,并且您没有从其他存储库中获取,那么您在只读副本上做了一个提交。它是如何到达那里的?
  • Weird... 在只读存储库中,您能否运行 git branch -agit remote -v 并将结果粘贴到您的问题中?
  • 就个人而言,我认为这是反对首先使用git pull 的另一个论点。 :-) 但是,是的,Abe Voelker 有正确的答案,这是一个混淆,git 没有意识到谁有哪些提交。

标签: git


【解决方案1】:

作为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 相同的位置,而不是删除整个 repo 并重新克隆:

$ git reset --hard origin/master

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

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

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

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

【讨论】:

  • 谢谢,但我肯定不会更改 RO 副本中的任何内容。我已经编辑了我的问题,以准确显示我做了什么以及如何重现问题。本地克隆是不可能的,因为我正在检查 Linux 和 OSX 上的 Win32 代码构建,并且换行符不同。从 github 克隆可以即时更正换行符。使用 git reset --hard origin/master 只会丢弃我从 github 提取的更改。这让我想知道 RO 存储库是否对其来源感到困惑。
  • @JohnRennie 您知道您可以使用core.autocrlf 设置或.gitattributes 文件来控制结帐中的换行符吗? “更正换行符”的不是“从 GitHub 克隆”,而是使用这些设置检查您的工作副本的行为。您可以从其他执行相同操作的本地存储库中克隆本地存储库,您只需 git init 他们,进行设置更改,然后添加遥控器和 fetchcheckout,这基本上是 clone 所做的。
【解决方案2】:

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

A parameter &lt;ref&gt; without a colon is equivalent to &lt;ref&gt;: when pulling/fetching, so it merges &lt;ref&gt; 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

【讨论】:

  • 就是这样!有用!非常感谢那些认为他对 git 足够了解的人:-)
猜你喜欢
  • 2023-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-15
  • 2010-12-12
  • 1970-01-01
  • 1970-01-01
  • 2019-12-11
相关资源
最近更新 更多