【问题标题】:Running git commands from post-receive hook从 post-receive 钩子运行 git 命令
【发布时间】:2015-09-04 23:25:40
【问题描述】:

解释我为什么要这样做很复杂,但我想做的是为特定的 git 存储库配备一个接收后挂钩,该挂钩执行以下操作:

  1. 移动到测试目录
  2. 克隆刚刚更新的项目。
  3. 结帐特定分支。
  4. 做一些测试

post-receive 代码如下所示(简化):让“repo”为 git 存储库的名称,让“testdir”为同级目录的名称,初始为空,让“dev”为名称分公司。

cd ../testdir
git clone --local ../repo .
git checkout dev

但是,当脚本中的代码到达“git checkout”时,git 会以“fatal: not a git repository: '.'”响应

我不知道为什么 git 认为“testdir”不是 git 存储库。如果我从命令行(而不是在接收后)运行该命令,那么它们可以正常工作。我不知道为什么这种行为会与接收后不同。有什么想法吗?

【问题讨论】:

  • 这是我原帖中的错字。那不是问题。我克隆到当前目录“testdir”。
  • 如果你执行 cd ../testdir git clone --local ../repo 。 (注意“。”)然后您仍然在 testdir 中,并且包含存储库的克隆。那么你还在同一个目录中
  • 哎呀,错过了尾随的.。对不起!

标签: git bash


【解决方案1】:

您需要在 post-receive 挂钩中取消设置 GIT_DIR。问题是在你的钩子脚本运行时,GIT_DIR=.,在你的 cd 和 clone 操作之后不再有用。

我搭建了一个本地测试环境,当我的post-receive 脚本看起来像这样:

#!/bin/sh

cd ../testdir
git clone --local ../upstream.git .
git checkout dev

我明白了:

remote: fatal: Not a git repository: '.'

但如果我取消设置 GIT_DIR 变量:

#!/bin/sh

unset GIT_DIR
cd ../testdir
git clone --local ../upstream.git .
git checkout dev

一切正常。

【讨论】:

  • 谢谢!这正是我所需要的!
  • 这是另一个相关的问题,希望有相关的答案。在我的实验中,我进行了硬重置,然后运行了一些清理代码。具体来说,我运行 git reset --hard HEAD^ git for-each-ref --format='delete %(refname)' refs/original | git update-ref --stdin git reflog expire --expire=now --all git gc --aggressive --prune=now 如果我从命令行运行该代码,它具有从 git 历史记录中删除最后一次提交的效果。但是从 post-receive 中运行它并没有相同的效果(无论如何在垃圾收集上)。
  • 我想知道是否有类似的变量会影响垃圾收集、reflog 和 prune 的工作方式?
猜你喜欢
  • 2012-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-02
  • 2017-10-19
  • 2010-11-24
  • 1970-01-01
  • 2014-05-13
相关资源
最近更新 更多