Git在服务器上存储文件的位置在哪里?

4
我按照这里的说明安装了git。然而,我创建了一个测试文件,提交并推送到服务器后,发现在git目录下找不到该文件。我希望文件能出现在机器上的web服务器可见的某个位置,以便通过http请求立即显示推送。

我知道git应该更加自包含,在客户端方面文件形成了一个可以用于此方式的良好包。服务器为什么不做同样的事情呢?

更新:我最初没有使用“bare”选项。但当我这样做,并尝试从远程进行初始提交时,我得到了一个我不太理解的巨大错误消息。

remote: error: refusing to update checked out branch: refs/heads/master
remote: error: By default, updating the current branch in a non-bare repository
remote: error: is denied, because it will make the index and work tree inconsistent
remote: error: with what you pushed, and will require 'git reset --hard' to match
remote: error: the work tree to HEAD.
remote: error:
remote: error: You can set 'receive.denyCurrentBranch' configuration variable to
remote: error: 'ignore' or 'warn' in the remote repository to allow pushing into
remote: error: its current branch; however, this is not recommended unless you
remote: error: arranged to update its work tree to match what you pushed in some
remote: error: other way.
remote: error:
remote: error: To squelch this message and still keep the default behaviour, set
remote: error: 'receive.denyCurrentBranch' configuration variable to 'refuse'.

由于我从未检查过任何东西,所以我不知道它的意思或者我真正应该做什么。


4
你可能使用了--bare参数创建了服务器的代码仓库,它告诉Git“不要保留该仓库的工作副本”。没有工作副本,文件(实际上是定义这些文件的对象)只存在于.git目录中。 - Chris Hayes
是的。当我最初没有这样做时,当我尝试提交时,我收到了一个大而可怕的拒绝消息。 - Michael
笑。你所说的“大可怕的拒绝信息”是什么? - brbcoding
1
我更新了我的问题,包括这个内容。 - Michael
转到 git 仓库并使用 git config receive.denyCurrentBranch ignore - Chris Hayes
显示剩余7条评论
2个回答

8
在客户端看来,一个仓库实际上有两部分组成。位于 .git 的实际仓库和你的工作树,后者通常包含当前检出提交对应的文件。
两者是相互独立的。工作树只用于进行更改并在之后更新仓库。
尽管一开始看起来你处于“仓库”中,但实际上你处于工作树中。从那里,您可以请求仓库以更新您的文件或将您的文件添加到仓库中的新提交中。-但您的仓库永远不会自己更改您的工作树。
你的远程仓库是一个裸仓库,也就是没有工作树的仓库。这是为了能够推送任意分支所需的。
因为它缺少工作树,所以你无法在任何地方看到文件。(即使有工作树,也不清楚要显示哪些文件。毕竟,你的仓库包含许多提交,每个提交都有不同的内容。)
要实际“看到”这些文件,最简单的方法是将您的仓库克隆到您的 Web 服务器目录中并检出正确的分支。-当然,您需要在主仓库更改时更新此仓库。这可以通过在主仓库中使用钩子来实现。在这种情况下,一个 post-receive-hook 就足够了。

谢谢,这个方法可行!顺便提醒其他人,由于环境变量的设置,我必须使用一些特殊标志来在post-receive钩子中进行pull操作。在我的钩子中,由于项目在cwd中,我执行了git --git-dir ./.git --work-tree . pull origin master;我还必须将git用户的公钥与自身共享,以避免ssh授权错误。 - Michael

0

把“上游”存储库设置为裸库是一个好习惯。这样做的好处是,你不会有修改服务器文件的冲动,因为服务器存储库通常归非个人账户所有。

为了满足你的需求,你可以在服务器上克隆存储库,并通过 web 服务器导出(只读)。


这个方法似乎不允许客户端任意推送更新,而是需要通过手动拉取才能使Web服务器看到更新? - Michael
它不必是手动的 - 请参考@michas出色答案中关于钩子的建议。然后接受它。 - Henk Langeveld

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