Я столкнулся со следующей ошибкой при попытке сделать gerrit-cherry-pick
, я сделал git remote -v
и вижу, что origin
указывает на ssh://[email protected]: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://[email protected]:29418/tech-ci.git (fetch)
origin ssh://[email protected]: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
Геррит-вишня-кирка:
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
@ MarceloÁviladeOliveira - Я получил gerrit-cherry-pick от https://gerrit-review.googlesource.com/Documentation/cmd-cherry-pick.html#_obtaining
, я сомневаюсь, что это имеет какое-либо отношение к файлу gerrit-cherry-pick
Это будет означать, что учетная запись пользователя, создающая эту команду, не имеет открытого SSH-ключа ~/.ssh/id_rsa.pub
по умолчанию, зарегистрированного в ~waccount/.ssh/authorized_keys
на сервере tech-gerrit.sd.company.com
.
Если возможно, попробуйте в той же последовательности команд выполнить
ssh -Tv -p 2941 [email protected]
Это отобразит более подробную информацию о неудачной попытке подключения.
Если это невозможно, попробуйте и убедитесь, что для переменной среды GIT_SSH_COMMAND
установлено значение «ssh -v
».
Я выполнил указанную выше команду и получил сообщение **** Welcome to Gerrit Code Review ****^M ^M Hi waccount, you have successfully connected over SSH.^M
, так что похоже, что он зарегистрирован, в чем еще может быть проблема, что можно попробовать? я сталкиваюсь с проблемой при запуске этой команды из крючка gerrit, не вижу, когда я запускаю это вне крючка
@Flair Вам нужно убедиться, что вы запускаете эту команду с той же учетной записью, что и тот, который фактически запускает ловушку.
@Flair Если это так, то установите для переменной среды GIT_SSH_COMMAND
значение «ssh -v
» и посмотрите, генерирует ли это больше журналов.
Как Марчелло указал выше, хотя текущий рабочий каталог является клоном репозитория, команды, похоже, выполняются из чистого (gerrit) репозитория, у меня, похоже, такая же проблема при запуске любой другой команды git, любые указатели на то, как исправить это?
Кажется, вы выполняете команды в чистом репозитории (репозиторий Gerrit), а не в дереве работы (клон репозитория). Помните, что хуки выполняются внутри репозитория Gerrit, который их запускает.
Я явно изменяю cwd для запуска из рабочего дерева (клон репозитория), но, как вы сказали, хотя текущий рабочий каталог является клоном репозитория, команды, похоже, выполняются из чистого репозитория, у меня такая же проблема при запуске любого другого Команда git также, любая идея, почему? какие-либо указатели на то, как это отлаживать? действительно ценю
Как это изменить?
Я первый спросил :-)
Я просто использовал chdir для изменения рабочего каталога, когда gerrit-cherry-pick
запускается, я печатаю os.getcwd (), и он указывает на клон репозитория, но каким-то образом команды запускаются в репозиториях gerrit, не в состоянии взломать это? Некоторые настройки среды? Любые указатели?
Добавьте к своему вопросу содержимое файла / gerrit_v2 / hooks / gerrit-cherry-pick.