很像this SO post,我有以下工作流程,我想用git维护:
我们的登台服务器为许多不同的网站提供服务。我想在用户主目录中的不同文件夹中为每个文件库设置存储库。每个存储库都有一个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
所以我需要:
我是否正确地解决了这个问题?如何获取git每个存储库所需的目录信息?
答案 0 :(得分:12)
如果我理解正确,那么每个Web根目录都有不同的存储库。如果是这种情况,您可以在存储库级别(在.git/config
文件中)设置工作树:core.worktree
。如果将repo配置为bare
:
[core]
bare = false
worktree = /webroot/dir/for/this/repo
一旦设置完毕,Git命令(如git status
)应该再次从存储库文件夹中工作,任何使用工作树(git status
,git 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)
三个选项:
$ git config alias.root '!pwd'
[alias]
findroot = "!f () { [[ -d ".git" ]] && echo "Found git in [`pwd`]" && exit 0; cd .. && echo "IN `pwd`" && f;}; f"
#!/bin/sh
f () { [[ -d ".git" ]] && echo "Found git in [`pwd`]" && exit 0; cd .. && f;}
f
答案 3 :(得分:1)
您可以随时按向上箭头获取所有信息,然后只需删除命令并替换另一个命令即可。你不应该重新输入整个东西。
如果您发布了许多其他命令并且不想过多地使用历史记录中的“向上箭头”,则可以按CTRL-R并开始键入“树”或“工作”。你应该在历史中找到其中一个运行的点。
否则,脚本将这些变量设置为已建议。