在Bash脚本中执行Git命令

12

我正在为中央代码库编写 gitosis 的提交后钩子。

它会将更新内容从中央代码库拉取到测试环境中。

nano /var/git/repositories/holding.git/hooks/post-update

 #!/bin/bash

 cd /var/vh/holding;
 git reset --hard;
 git checkout testing;
 git pull;

这是我在客户端(开发虚拟机)上进行推送后得到的结果

# blah ...
Counting objects: 57, done.
Compressing objects: 100% (24/24), done.
Writing objects: 100% (30/30), 3.42 KiB, done.
Total 30 (delta 18), reused 0 (delta 0)
fatal: Not a git repository: '.'
fatal: Not a git repository: '.'
fatal: Not a git repository: '.'
fatal: Not a git repository: '.'
To git@cheby.ru:holding.git
   233b5a2..0f46cd8  testing -> testing

显然,我告诉git应该在哪里进行pull的尝试失败了。

在bash脚本中为指定的工作副本运行git命令的正确方法是什么?


可能是可以的,甚至有文档记录(需要检查手册),在处理钩子函数时GIT_DIR被设置为“。”。 - sehe
4个回答

5
那里所述,您可以在所有git命令之前加上以下内容:
 env -i

为了确保没有副作用,例如一个可能已经设置的GIT_DIR环境变量。可以使用env -i或者简单地使用unset GIT_DIR命令。

2
对我而言,使用env -i前缀无效。我总是会得到以下错误:

*** 请告诉我你是谁。

尽管我已经设置了全局配置。这是通过指定--git-dir参数适用于我的方法:
#!/bin/sh

GIT='git --git-dir='$PWD'/.git'

$GIT checkout hotfix
$GIT merge --no-ff master -m "Merged master"
$GIT push

我在工作目录中运行脚本,因此我使用$PWD获取当前工作目录。如有需要,您可以进行调整。


0

/var/vh/holding 是一个 git 仓库吗?也就是说,您是否在其上运行了 git init,设置了远程,将其设置为跟踪您的 holding.git 目录等等?此外,如果您不是从您正在推送到的相同仓库中拉取代码,那么您不需要使用 resetcheckout 命令。


0

我们可以使用--git-dir参数来指定.git路径。

例如:我们可以这样调用git log

git --git-dir=<path to git cloned dir>/.git log

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接