如何设置GIT_DIR& GIT_WORK_TREE维护多个存储库时

时间:2012-05-30 18:07:18

标签: git repository

很像this SO post,我有以下工作流程,我想用git维护:

  1. 多人在当地发展
  2. 提交一些事情
  3. 承诺更多事情
  4. 推送到舞台
  5. 在分段上测试新代码
  6. 推送到制作
  7. 我们的登台服务器为许多不同的网站提供服务。我想在用户主目录中的不同文件夹中为每个文件库设置存储库。每个存储库都有一个post-receive挂钩(ala the Daniel Messier article),用于检查对该站点/存储库的Web根目录的更改。

    这是给我带来麻烦的第六号。

    当我尝试运行任何git命令时,我收到错误“致命:此操作必须在工作树中运行”。我是否从存储库运行'git status'(/home/gituser/website1.git - 我认为不应该工作..)或者从web根目录(/ var / www / website1)得到此错误。

    但是,如果我指定GIT_DIR和GIT_WORK_TREE,那么我可以运行git命令。这两项工作都是:

    $ git --git-dir /home/gituser/website1.git --work-tree /var/www/website1 status
    $ GIT_DIR=/home/gituser/website1.git GIT_WORK_TREE=/var/www/website1 git status 
    

    所以我需要:

    1. 键入目录和工作树以及每个命令的替代方法
    2. 将它们设置为持久性环境变量的替代方法,因为这只适用于website1,而不适用于website2,website3等
    3. 我是否正确地解决了这个问题?如何获取git每个存储库所需的目录信息?

4 个答案:

答案 0 :(得分:12)

如果我理解正确,那么每个Web根目录都有不同的存储库。如果是这种情况,您可以在存储库级别(在.git/config文件中)设置工作树:core.worktree。如果将repo配置为bare

,则无效
[core]
    bare = false
    worktree = /webroot/dir/for/this/repo

一旦设置完毕,Git命令(如git status)应该再次从存储库文件夹中工作,任何使用工作树(git statusgit checkout等)的命令都将使用使用core.worktree位置。 (请注意,Git命令仍无法在工作树位置工作,因为它不是存储库。)

答案 1 :(得分:3)

只是一个建议。

实现名为“git”的脚本文件,该文件位于/ usr / bin中git可执行文件之前的用户路径之前的目录中。 shell脚本git只是/ usr / bin / git上的一个瘦包装器。它做的第一件事是检测从哪个目录git调用,并尝试自动推断它正在使用什么repo。也许在脚本可以读取的每个存储库的根目录中有一个“my.config”文件。然后脚本调用“/ usr / bin / git --git-dir”并设置GIT_DIR和GIT_WORK_TREE变量,然后使用相同的命令行参数调用/ usr / bin / git。

答案 2 :(得分:2)

三个选项:

1)添加本地别名:

$ git config alias.root '!pwd'

2)添加全局别名($ HOME / .gitconfig):

[alias]
 findroot = "!f () { [[ -d ".git" ]] && echo "Found git in [`pwd`]" && exit 0; cd .. && echo "IN `pwd`" && f;}; f"

3)脚本,findgitroot.sh例如

#!/bin/sh
f () { [[ -d ".git" ]] && echo "Found git in [`pwd`]" && exit 0; cd .. && f;}
f

答案 3 :(得分:1)

您可以随时按向上箭头获取所有信息,然后只需删除命令并替换另一个命令即可。你不应该重新输入整个东西。

如果您发布了许多其他命令并且不想过多地使用历史记录中的“向上箭头”,则可以按CTRL-R并开始键入“树”或“工作”。你应该在历史中找到其中一个运行的点。

否则,脚本将这些变量设置为已建议。