2015-09-04 107 views
0

解释为什么我想这样做是复杂的,但我想这样做是使特定的Git仓库用后收到挂钩,执行以下操作:运行git命令后收到钩

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

的后收到的代码如下所示(简化):让“回购”是Git仓库的名称,让“TESTDIR”是同级目录的名称,初始为空,并让“dev”作为分支的名称。

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

然而,当脚本代码获取到“混帐结账”,git的响应“:没有一个Git仓库:致命‘’”

我不知道为什么混帐认为“TESTDIR “不是一个混帐存储库。如果我从命令行运行该命令(而不是从post-receive中运行),那么它们可以正常工作。我不知道为什么这种行为会与接收后的行为有所不同。有任何想法吗?

+0

这是我原来的帖子中的一个错字。这不是问题。我克隆到当前目录“testdir”。 –

+0

如果你这样做 cd ../testdir git clone --local ../repo。 (注意“。”) 那么你仍然在testdir中,并且包含存储库的一个克隆。 那么你仍然在同一个目录 –

+0

哎呀,错过了后面的'.'。抱歉! – larsks

回答

1

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

我成立了一个本地测试环境,而当我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 

一切正常。

+0

谢谢!这正是我需要的! –

+0

这是另一个相关的问题,希望有相关的答案。在我的实验中,我做了一个硬重置,然后运行一些清理代码。具体而言,我运行 '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运行它并没有同样的效果(无论如何,垃圾回收)。 –

+0

我想知道是否有一个类似的变量会影响垃圾收集,reflog和修剪的工作方式? –