这可能是关于惯例,最佳做法和/或个人偏好的问题:
所以我是一个git noob,我的网站代码不值得分享,所以我不使用github等。
知道git不需要中央存储库我想:很棒,我的工作站和服务器是两个节点,我只是将更改从我的工作站推送到服务器。
当我开始时,代码只在服务器上,所以我:
git init
git clone me@myserver:path/to/repo
git push me@myserver:path/to/repo
我得到了奇怪的结果。我在本地添加添加的文件出现在服务器上,但未反映对现有文件的更改。
然后我读了一个警告,反对推送到签出的远程分支。所以新的设置是:
git clone --bare
成为裸存储库~/repos/mysite.git
- 而不是公用文件夹)git push me@myserver:repos/mysite.git
git pull ~/repos/mysite.git
以获取最新的这是否正确?这合乎逻辑吗?这是你会做的吗?
答案 0 :(得分:4)
您的新设置 是设置服务器存储库的正确方法。
有关详细信息,请参阅 Pro Git 一书中的Getting Git on a Server章节。
答案 1 :(得分:4)
无论您选择做什么,您可能希望使用git hooks进行一些自动化。钩子是一组git将在某些事件上执行的脚本。这里的相关内容是更新后的挂钩(在服务器的存储库中)。在正常的回购中,钩子在.git/hooks
中,因此在一个裸仓库中它们位于hooks
。该目录当前可能包含许多示例钩子脚本(在最近的版本中名为*.sample
)。您需要创建一个名为post-update
的名称,其中包含您在推送服务器后要执行的任何操作(例如,cd到其他repo并执行拉动)。
至于你的解决方案的具体细节......你没有进入一个签出的分支机构做正确的事情。您正在做的唯一可能的问题是服务器最终会得到一个额外的存储库副本,仅用于检出文件。如果你决定不喜欢这种浪费的磁盘空间,我很确定这会做你想做的事情:
git --work-tree=/path/to/checkout-dir --bare reset --hard
这告诉git使用给定的路径作为工作目录重置为正确的状态,但要记住存储库实际上是裸的。我之前没有亲自做过这种事情,但它似乎对我的小测试起作用了!
注意:如果您决定要进入已签出的分支机构(仅当服务器上的存储库永远不会被用于推送和检出文件的副本)...如果您完全确定这一点,可以在服务器的gitconfig中将receive.denyCurrentBranch设置为false,在服务器上执行git reset --hard
,强制其工作目录进入它应该处于的状态。
答案 2 :(得分:2)
阅读“为什么我不会在”git push“之后看到远程仓库的变化?”在GitFaq(在Git Wiki上)。