【问题标题】:How to set GIT_DIR & GIT_WORK_TREE when maintaining multiple repositories维护多个仓库时如何设置 GIT_DIR & GIT_WORK_TREE
【发布时间】:2012-05-30 18:07:17
【问题描述】:

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

  1. 多人本地开发
  2. 提交一些事情
  3. 提交更多内容
  4. 推送到暂存
  5. 在 Staging 上测试新代码
  6. 投入生产

我们的登台服务器为许多不同的站点提供服务。我想在用户主目录的不同文件夹中为每个设置存储库。每个存储库都有一个接收后挂钩 (ala the Daniel Messier article),用于将更改检出到该站点/存储库的 Web 根目录中。

给我带来麻烦的是六号。

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

但是,如果我指定 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 等

我这样做对吗?如何获取 git 每个存储库所需的目录信息?

【问题讨论】:

    标签: git repository


    【解决方案1】:

    如果我理解正确的话,每个 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 命令仍然无法从工作树位置运行,因为它不是存储库。)

    【讨论】:

    • 谢谢。我已经尝试过 config.worktree 方法,但我没有注意到 bare=true。
    【解决方案2】:

    只是一个建议。

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

    【讨论】:

    • 哦,我喜欢这个主意。不幸的是,我不擅长编写 shell 脚本.. 帮助不大? :)
    【解决方案3】:

    三个选项:

    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
    

    【讨论】:

    • 对不起,这里是个白痴——选项 1,是 .bash_profile 或 git config 的 sn-p 吗?再次感谢您为此问题提供了一些示例。
    • 选项 1 将用于 git config。但是,从那时起,我发现了许多其他更好的选择:3) git config alias.root '!pwd'(这将为您提供具有所需结果的 'git root' 命令) 4) git rev-parse --show-toplevel
    • 谢谢!所以对于 3),您将使用 git root commit -am "Commit Msg" 而不是 git commit -am "Commit Msg"
    • 嗯。不。您将使用这个新别名来直接查找根目录的位置,例如:'$ git root' 或 'cd git root 等。
    【解决方案4】:

    您可以随时按向上箭头获取所有信息,然后删除命令并替换为另一个命令。您不需要重新输入整个内容。

    如果您发出了许多其他命令并且不想在历史记录中“向上箭头”太多,您可以按 CTRL-R 并开始输入“tree”或“work”。您应该了解其中一个运行的历史点。

    否则,按照已建议的方式设置这些变量的脚本。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-12-22
      • 1970-01-01
      • 1970-01-01
      • 2011-12-05
      • 1970-01-01
      • 2016-08-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多