6

这可能是关于惯例、最佳实践和/或个人偏好的问题:

所以我是一个git noob,我的网站代码不值得分享,所以我没有使用github之类的。

知道 git 不需要中央存储库,我想:太好了,我的工作站和服务器是两个节点,我只需将更改从我的工作站推送到服务器。

当我开始时,代码只在服务器上,所以我:

  1. 在服务器上: git init
  2. 在工作站上:git clone me@myserver:path/to/repo
  3. 愉快地进行更改并在本地提交
  4. 在工作站上:git push me@myserver:path/to/repo

我得到了奇怪的结果。我在本地添加的文件出现在服务器上,但未反映对现有文件的更改。

然后,我阅读了一条警告,禁止推送到已签出的远程分支。所以新的设置是:

  1. 跑来git clone --bare做一个裸仓库
  2. 将裸存储库放在我的服务器上(~/repos/mysite.git- 不是公用文件夹)
  3. 代码本地和:git push me@myserver:repos/mysite.git
  4. 在服务器上:git pull ~/repos/mysite.git获取最新的

这是正确的吗?合乎逻辑吗?这是你会做的吗?

4

3 回答 3

4

您的新设置设置服务器存储库的正确方法。

有关更多信息,请参阅Pro Git书上的在服务器上获取 Git章节。

于 2009-08-28T16:18:47.057 回答
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,强制其工作目录进入它应该处于的状态。

于 2009-08-28T16:35:12.327 回答
2

阅读“为什么在“git push”之后我看不到远程仓库的变化?” 在GitFaq(在 Git Wiki 上)。

于 2009-08-28T18:32:13.840 回答