Почему `git -C` не работает с Python при получении сообщения? - PullRequest
0 голосов
/ 06 февраля 2019

Попробуйте:

mkdir /tmp/one
cd /tmp/one
git init
echo -e "#!/usr/bin/env python3\nimport os\nos.system('git -C /tmp/one show')" > /tmp/one/.git/hooks/post-receive
chmod +x /tmp/one/.git/hooks/post-receive
touch test.txt
git add test.txt
git commit -m 'Initial commit'
cd /tmp/
git clone one two
cd two
git checkout -b test
echo "Why doesn't this work?" >> test.txt
git add test.txt
git commit -m "testing"
git push -u origin test

И обратите внимание на очень запутанное сообщение:

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

Что?

Серьезно, что за херня?Почему это полностью сломано?Я могу перейти к буквальной папке, которая не является репозиторием git (cd / && git -C /tmp/one/show), и она работает нормально.Почему эта команда не работает?

Она также не работает, если я выполняю os.chdir('/tmp/one').Я не могу заставить крюк после получения на самом деле понять, что, черт возьми, происходит.Более чем приятно запускать некоторые другие команды, например git merge, но он не поймет git show, состояние git или, что более важно для меня, git -C /tmp/one checkout master.Я также попробовал только с голым

#!/bin/sh
git -C /tmp/one status

И это дает мне то же сообщение об ошибке - not a git repostiory: '.'

Любая подсказка, что здесь происходит в мире?

1 Ответ

0 голосов
/ 06 февраля 2019

Проблема здесь в том, что команды, запускаемые из ловушки Git, запускаются с различными установленными переменными среды.Тебя бьет по $GIT_DIR, но могут быть и другие (например, $GIT_WORK_TREE, $GIT_INDEX_FILE и т. Д.).

Они настроены правильно для раздачис репозиторием вы находитесь в в то время, когда хук запускается .Но вы не хотите, чтобы этот хук имел дело с этим хранилищем.Вы хотите этот хук к chdir где-то еще и иметь дело с некоторым другим хранилищем.В этот момент вы должны удалить ненужные переменные среды или переопределить их с правильными настройками для этого хранилища.

Короче, добавьте:

unset GIT_DIR

(для sh / bash / и т. д.) или в Python:

del os.environ['GIT_DIR']

(обратите внимание, что версия Python работает, только когда она действительно установлена), или используйте аргумент env при использовании subprocess и т. д.

...