0

该主题的问题与 gitguys.com 似乎声称的内容有关,以解释在多个用户使用 NON-NARE 存储库(http://www.gitguys. com/topics/shared-repositories-should-be-bare-repositories/

在上述网页中解释说,如果有人创建了一个非裸 git 存储库,其中 git 存储库用户和远程用户都在更新 git 对象数据库。非裸 git 存储库的创建者将使用 git status 命令一分钟看看这个: $ git status

# On branch master

nothing to commit (working directory clean)

下一分钟,远程用户可以 git 将更改推送到非裸存储库中。然后,当非裸 git 存储库的创建者键入 git status 时,git 会找到一个不同的对象数据库,并为这次运行 git status 给出不同的结果。我知道: 除非用户更改了工作目录或其对象数据库中的文件,否则 git status 的输出不应更改!

我觉得这“很难解释”,因为这个陈述是为什么在多个用户共享该存储库的中央存储库环境中应该使用裸存储库(与非裸存储库相反)的基本原理。这句话对我来说似乎不正确,因此很难解释为什么在多用户开发环境中需要裸存储库。这是不正确的,因为它暗示 GIT 状态受服务器存储库状态的影响,而我认为/相信 git 状态仅考虑本地 .git 文件对象和工作目录(即,不在服务器上)

请注意,我一直在试图解释为什么裸存储库是必需的,而不仅仅是认为裸存储库有利于共享环境——但到目前为止我还没有取得太大的成功(包括在这个网站中,也许是因为我没有正确地提出手头的问题;我希望这次我能正确地提出问题)

有人可以解释一下,即使在处理具有多个用户的非裸存储库(假设 2 个用户:用户 A 和用户 B)时,例如,用户 A 在发出 git status 时可能会因为更改而得到 2 个不同的结果,然后是用户 B 的 git push

4

1 回答 1

0

在我看来,尽管我可能是错的,但您似乎很难理解团队如何通过远程存储库有效地协作项目。

在开始解决您的困惑之前,我将解释一些基本概念。


首先让我们定义远程存储库到底是什么。在 git 的世界中,远程存储库只不过是您通过git remote命令在本地存储库中注册的存储库。
这个存储库甚至不需要与您的本地存储库有共同的历史记录,它不需要是裸露的,它不需要存在于服务器上——它甚至可以在你本地机器上的同一个文件夹中——它只需要git remote在您的本地存储库中注册即可被视为远程存储库

很一般,不是吗?

在团队中工作时,git 中的一个常见工作流程是定义一个所有开发人员都注册为远程的中央存储库。克隆存储库 ( git clone) 时,此存储库会将克隆的存储库注册为远程存储库

每个开发人员现在都可以在本地工作并将他们的更改推送到这个中央存储库;其他开发人员可以从那里获取这些更改。

但它不需要是这样的。

Git 是一个分布式版本控制系统,这意味着存储库的每个克隆都是一个完整的备份,并且可以用作远程存储库(使用 git 术语)。

这对我们意味着什么?这意味着仅中央存储库的工作流程是团队中的共同协议,将这个存储库视为真正的存储库。


现在让我们回到你的困惑:

例如,只要您遵循中央存储库的工作流程,任何推送都不会更改存储库的本地克隆(意味着git status永远不会“自行更改”)。

如果我正确理解了您的评论,则用户 B 克隆了用户 A 的存储库。我们从克隆存储库中学到了什么?用户 A 的存储库现在被视为用户 B 克隆中的远程存储库

这意味着用户 B 所做的每次推送都会将他的更改推送到用户 A 的存储库中——默认情况下,git 不允许推送到非裸存储库,但这是可能的。git status即使用户 A 没有进行任何更改,但用户 B 进行了推送,这样的推送也可以有效地更改输出。

于 2015-01-06T08:00:16.360 回答