致命错误:gerrit-cherry-pick:“origin”似乎不是Git存储库

3

我在尝试进行 gerrit-cherry-pick 时遇到了以下错误,我执行了 git remote -v 命令并看到 origin 指向 ssh://waccount@tech-gerrit.sd.company.com:29418/tech-ci.git ,有人能提供为什么会出现这个错误的指导吗?如何进一步调试并解决这个问题?

2018-08-09 21:13:15 change-merged   runCmd               169    INFO    : Running command git --git-dir=/gerrit_v2/hooks/tech_projects/tech-ci/.git --work-tree=/gerrit_v2/hooks/tech_projects/tech-ci remote -v
2018-08-09 21:13:15 change-merged   runCmd               173    INFO    :
origin  ssh://waccount@tech-gerrit.sd.company.com:29418/tech-ci.git (fetch)
origin  ssh://waccount@tech-gerrit.sd.company.com:29418/tech-ci.git (push)

2018-08-09 21:13:15 change-merged   runCmd2              180    INFO    : Running command /gerrit_v2/hooks/gerrit-cherry-pick origin 20633/2
2018-08-09 21:13:15 change-merged   runCmd2              187    INFO    : fatal: 'origin' does not appear to be a git repository
fatal: The remote end hung up unexpectedly

Gerrit-cherry-pick:

usage() {
  echo >&2 "usage: $0 remote changeid..."
  echo >&2 "usage: $0 --continue"
  echo >&2 "usage: $0 --skip"
  echo >&2 "usage: $0 --abort"
  echo >&2 "usage: $0 [--close|--replace] remote"
  exit 1
}

die() {
  echo >&2 "fatal: $1"
  exit 1
}

GIT_DIR=$(git rev-parse --git-dir) || exit
CL="$GIT_DIR/GERRIT_CHANGES"
STATE="$GIT_DIR/rebase-gerrit"
TODO="$STATE/todo"

RESOLVEMSG="
When you have resolved this problem run \"$0 --continue\".
If you would prefer to skip this patch, run \"$0 --skip\".
"

pop_action() {
  sed -e 1d <"$TODO" >>"$TODO".new
  mv -f "$TODO".new "$TODO"
}

mark_done() {
  read commit changeid <"$TODO"
  changeid=$(get_changeid "$changeid")
  head_after=$(git rev-parse HEAD^0)
  head_before=$(cat "$STATE/head_before")
  if ! test $head_after = $head_before
  then
    echo $head_after >"$CL/$changeid"
  fi
  pop_action
}

do_next() {
  while test -s "$TODO"
  do
    read commit changeid <"$TODO"
    git rev-parse HEAD^0 >"$STATE/head_before"
    git format-patch \
        -k --stdout --full-index --ignore-if-in-upstream \
        $commit^..$commit |
    git am $git_am_opt --rebasing --resolvemsg="$RESOLVEMSG" || exit
    mark_done
  done

  echo >&2 "Done."
  rm -rf "$STATE"
}

git_am_opt=
if test -f "$STATE/git_am_opt"
then
  git_am_opt=$(cat "$STATE/git_am_opt")
fi

while test $# != 0
do
  case "$1" in
  --continue)
    test -f "$TODO" || die "No cherry-pick in progress?"
    git am $git_am_opt --rebasing --resolvemsg="$RESOLVEMSG" --resolved || exit
    mark_done
    do_next
    exit
    ;;
  --skip)
    test -f "$TODO" || die "No cherry-pick in progress?"
    git reset --hard HEAD || exit
    git am --skip || exit
    pop_action
    do_next
    exit
    ;;
  --abort)
    test -f "$TODO" || die "No cherry-pick in progress?"
    git reset --hard HEAD
    git am --skip
    rm -rf "$STATE"
    ;;
  --close|--replace)
    shift
    test -d "$CL" || die "No changes to close"
    test $# = 1   || usage
    remote=$1
    printf %s "git push $remote" >&2
    rs=$(cd "$CL" && for change_id in *; do
      test "$change_id" = '*' && die "No changes to close"
      c=$(cat "$change_id");
      echo "$c:refs/changes/$change_id";
      echo ' \' >&2;
      printf %s "  $c:refs/changes/$change_id" >&2
      done)
    echo >&2
    echo >&2
    git push $remote $rs
    rc=$?
    test $rc = 0 && rm -rf "$CL"
    exit $rc
    ;;
  --whitespace=*)
    git_am_opt="$git_am_opt $1"
    ;;
  --committer-date-is-author-date|--ignore-date)
    git_am_opt="$git_am_opt $1"
    ;;
  -C*)
    git_am_opt="$git_am_opt $1"
    ;;
  -s|--signoff)
    git_am_opt="$git_am_opt $1"
    ;;
  -*)
    usage
    ;;
  *)
    break
    ;;
  esac
  shift
done

get_changeid() {
  case $1 in
  */*) echo ${1%%/*} ;;
  *)   echo $1 ;;
  esac
}

to_ref() {
  case $1 in
  */*)
    change_id=${1%%/*}
    patchset_id=${1##*/}
    ;;
  *)
    change_id=$1
    patchset_id=1
    ;;
  esac

  hash=$(($change_id % 100))
  case $hash in
  [0-9]) hash="0$hash" ;;
  esac

  echo "refs/changes/$hash/$change_id/$patchset_id"
}

get_revid() {
  grep $(to_ref $1) <"$GIT_DIR/FETCH_HEAD" | cut -f1
}

# Initialize state
#
test $# -lt 2 && usage
remote="$1"
shift

mkdir "$STATE" || die "cherry-pick already in progress"
echo $git_am_opt >"$STATE/git_am_opt"

if ! git fetch $remote $(for id; do to_ref $id; done)
then
  rm -rf $STATE
  exit 1
fi

(for id
 do
  if revid=$(get_revid $id)
  then
    echo "$revid $id"
  else
    echo >&2 "fatal: $id not found"
    exit 1
  fi
done) >"$TODO"

mkdir -p "$CL"
echo >&2
do_next

请在您的问题中添加 /gerrit_v2/hooks/gerrit-cherry-pick 文件的内容。 - Marcelo Ávila de Oliveira
@MarceloÁviladeOliveira - 我从 https://gerrit-review.googlesource.com/Documentation/cmd-cherry-pick.html#_obtaining 获取了 gerrit-cherry-pick,我怀疑它与 gerrit-cherry-pick 文件无关。 - Ritz
2个回答

0

看起来你是在裸仓库(Gerrit仓库)中执行命令,而不是在工作树(仓库克隆)中执行。请记住,钩子是在触发它们的Gerrit仓库内部执行的。


我明确地将cwd更改为从工作树(存储库克隆)运行,但正如您所说,即使当前工作目录是存储库克隆,命令似乎也是从裸存储库执行的。在运行任何其他git命令时,我似乎遇到了相同的问题,有什么想法吗?有没有关于如何调试的指针?非常感谢。 - Ritz
如何更改? - Ritz
我先问的 :-) - Marcelo Ávila de Oliveira
我刚刚使用了chdir来更改工作目录,当执行gerrit-cherry-pick时,我打印了os.getcwd(),它指向存储库克隆,但是某种方式命令在gerrit存储库上运行,无法解决这个问题?是否有一些环境设置或者指针可以提供? - Ritz

0

这意味着执行该命令的用户帐户在 tech-gerrit.sd.company.com 服务器上的 ~waccount/.ssh/authorized_keys 中没有将其 ~/.ssh/id_rsa.pub 默认公共 SSH 密钥注册。

如果可能,请尝试在同一命令序列中执行。

ssh -Tv -p 2941 waccount@tech-gerrit.sd.company.com 

这将显示有关连接失败尝试的更多详细信息。

如果不可能,请确保环境变量 GIT_SSH_COMMAND 设置为 'ssh -v'。


我运行了上述命令并收到了消息 **** 欢迎使用 Gerrit 代码审查 ****^M ^M Hi waccount,您已成功通过 SSH 连接。^M ,因此看起来它已经注册了,还可能有什么问题,可以尝试什么?当我从 Gerrit 钩子中运行此命令时遇到了问题,但在钩子之外运行时却没有发现。 - Ritz
@Flair 你需要确保使用与实际运行钩子的用户帐户相同的用户帐户来运行该命令。 - VonC
@Flair 如果是这种情况,那么请将环境变量GIT_SSH_COMMAND设置为"ssh -v",看看是否会生成更多的日志。 - VonC
正如Marcello在上面指出的那样,尽管当前工作目录是存储库克隆,但命令似乎是从裸(gerrit)存储库执行的。我运行任何其他git命令时似乎也有同样的问题,请问如何解决? - Ritz

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