生产,登台,开发网站和git repos在同一台服务器上:如何设置GIT_DIR和GIT_WORK_TREE

时间:2012-11-02 01:55:27

标签: git deployment version-control github agile

我已经阅读过一些帖子,这些帖子似乎让我很接近,但并非一直到我喜欢的方式。我有一台服务器。在它上面,我有3个网站:www.domain.com,staging.domain.com和dev.domain.com。我也在local.domain.com上开发,并使用Gi​​tHub作为我的核心仓库。

我想把我的git存储库从我的web根目录中删除。我愿意这样做。我正在尝试的是:

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

如果通过设置GIT_DIR和GIT_WORK_TREE(我在.bash_profile中导出路径)只有1个站点和回购,我知道怎么做。

似乎我可以在每个存储库的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 repo。如果我在/home/user/domains/staging.domain.com/public_html,它与登台 .git绑定。

2 个答案:

答案 0 :(得分:3)

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

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

这将导致您的Web根目录中出现.git文件,但如果有人访问该文件,那么唯一会泄漏的文件就是存储库的路径。这样可以避免根据您所在的目录设置$GIT_DIR变量来玩游戏。

答案 1 :(得分:0)

你想做什么?

/home/user/git/production.git中,它应该将工作目录检测为/home/user/domains/www.domain.com/public.html,并且推/拉/结帐应该在那里正常工作。不幸的是,git不是通灵的 - 来自没有.git文件夹的随机目录git甚至不知道在哪里查找配置文件(没有a "gitdir" file,正如我刚从其他答案中了解到的那样)。

您可以随时传递git --git-dir=~git/production.git checkout ...等等,但我打赌您正在寻找自动化解决方案。

也许尝试在shell脚本中包装git?如果您将其设为~/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      

(旁注:为什么你有三个回购?我发现有一个包含三个不同分支名称的repo,以及一个将每个分支检出到其相应目录的脚本更常见。)