11

就像这篇 SO post一样,我有以下我想用 git 维护的工作流程:

  1. 多人在当地发展
  2. 提交一些事情
  3. 提交更多的东西
  4. 推送到暂存
  5. 在 Staging 上测试新代码
  6. 推向生产

我们的登台服务器服务于许多不同的站点。我想在用户主目录的不同文件夹中为每个设置存储库。每个存储库都会有一个 post-receive 钩子(类似于Daniel Messier 的文章),用于检查该站点/存储库的 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 每个存储库所需的目录信息?

4

4 回答 4

17

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

于 2012-05-30T21:41:39.313 回答
3

只是一个建议。

实现一个名为“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。

于 2012-05-30T18:30:31.817 回答
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
于 2012-11-01T16:16:09.963 回答
1

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

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

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

于 2012-05-30T18:25:24.093 回答