在同一台服务器上设置生产、暂存和开发网站以及git仓库:如何设置GIT_DIR和GIT_WORK_TREE?

3

我已经阅读了一些文章,这些文章似乎让我接近我想要的但并不能完全满足我的需求。我有一个服务器,在上面,我有3个网站:www.domain.com、staging.domain.com和dev.domain.com。我还在local.domain.com进行开发,并使用GitHub作为我的中央存储库。

我希望将我的git存储库保留在我的网站根目录之外。我愿意采用任何方法来实现这一点。我正在尝试的是:

/home/user/git/production.git 
/home/user/git/staging.git
/home/user/git/development.git

如果只有一个站点和一个代码库,我知道如何通过设置GIT_DIR和GIT_WORK_TREE来实现这一点(我将路径导出到.bash_profile中)。

看起来我可以在每个仓库的config中设置工作树,例如:

[core]
    bare = false
    worktree = /home/user/domains/www.domain.com/public_html

但是我该如何设置GIT_DIR

如果我在 /home/user/domains/www.domain.com/public_html 目录下执行 git status 等命令,它会引用生产环境的 git 仓库。而如果我在 /home/user/domains/staging.domain.com/public_html 目录下执行相同的命令,则会使用与之关联的staging.git 仓库。


我已经使用git以以下方式解决了开发/暂存/生产问题...我的主分支是我的开发分支的头(我在本地进行开发...)。然后,我创建一个反映配置更改以使其处于暂存状态的分支,然后再从暂存分支创建另一个分支以进行生产配置更改。每次我准备部署时,我会将我的暂存和生产分支(在标记版本以进行历史记录之后)rebase到我的开发分支上...这样可以保持一切整洁,并位于一个git树中。 - g19fanatic
2个回答

3

你可以使用gitlink文件而不是设置$GIT_DIR。要做到这一点,只需进入每个工作树的根目录并运行:

echo "gitdir: /home/user/git/production.git" > .git

这将导致在您的Web根目录中有一个.git文件,但如果有人访问它,唯一泄漏的就是存储库的路径。这将避免需要根据所在目录设置$GIT_DIR变量的麻烦。

1
不错!以前从没见过这个。该功能的描述在gitrepository-layout man page上。 - Jeff Bowman
哇,这真是简单易行,而且效果很好!我想逐步记录如何设置开发/git环境,以便其他人可以从这里和其他地方找到的所有技巧中受益。有人能建议一个好的地方来记录这个过程吗?比如说,Stack Overflow、GitHub、Gist或者类似的地方,其他人可以在那里找到它并可能做出贡献? - Joe Fletcher

0

你在尝试做什么?

当位于/home/user/git/production.git路径下时,应将工作目录识别为/home/user/domains/www.domain.com/public.html,push/pull/checkout应该可以在那里正常工作。不幸的是,git并不是通灵的 - 在没有.git文件夹的任意目录中,git甚至不知道在哪里查找配置文件(如果没有 "gitdir"文件,正如我从其他答案中学到的)。

您始终可以传递git --git-dir=〜git/production.git checkout ...等命令,但我敢打赌您正在寻找自动化解决方案。

也许尝试将git包装在shell脚本中?如果将其放置在〜/bin/autogit中,会怎样呢:

#!/bin/bash
DIR=$(pwd)
if (fgrep -q domains/www.domain.com <<< "$DIR"); then
  git --git-dir=/home/user/git/production.git $@
elif (fgrep -q domains/staging.domain.com <<< "$DIR"); then
  git --git-dir=/home/user/git/staging.git $@
elif (fgrep -q domains/local.domain.com <<< "$DIR"); then
  git --git-dir=/home/user/git/development.git $@
fi
echo "Autogit failed from directory $DIR."
exit 1      

(旁注:为什么你有三个存储库?我发现更常见的做法是只有一个存储库,但有三个不同的分支名称,并且有一个脚本来将每个分支检出到其相应的目录。)

每个工作树都需要一个仓库,因为每个工作树都需要不同的“HEAD”。有一个来自“git.git”的contrib/workdir/git-new-workdir脚本可以解决这个问题,但是如果使用不当可能会有一些危险。 - qqx

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