Вытягивание Git зависит от текущего каталога

Я пытаюсь git pull некоторый репозиторий через пользователя root из любого каталога.

Например, выполнение git pull из /root/:

#> cd ~
#> sudo -u dmalikov git --git-dir=/home/dmalikov/path/to/repo/.git pull 
/usr/libexec/git-core/git-sh-setup: line 142: cd: /root/.: Permission denied
Cannot chdir to /root/., the toplevel of the working tree

И выполнение git pull из /:

#> cd /
#> sudo -u dmalikov git --git-dir=/home/dmalikov/path/to/repo/.git pull 
Already up-to-date.

Почему текущий каталог влияет на команду git pulling?

Как можно избежать этого лишнего cd?


person ДМИТРИЙ МАЛИКОВ    schedule 24.03.2012    source источник
comment
Где /root это папка внутри вашего репо? Если это так, у вас не должно быть проблем с разрешением. Если /root находится за пределами вашей структуры git, возникает вопрос, почему он вообще обращается к этой папке?   -  person bluesman    schedule 26.03.2012
comment
Почему вы пытаетесь работать как root?   -  person Ethan    schedule 30.03.2012
comment
Я пытаюсь работать с root, потому что это содержимое eix-sync.conf.   -  person ДМИТРИЙ МАЛИКОВ    schedule 30.03.2012


Ответы (3)


В вашем первом примере команда git запускается от имени пользователя dmalikov с текущим каталогом /root. Поскольку команда git pull эквивалентна git fetch, за которой следует git merge, и поскольку git merge работает с рабочим деревом, git пытается найти рабочее дерево. Поскольку у этого пользователя нет разрешения на cd /root, команда git завершается ошибкой.

Даже ваш второй пример не работает так, как вы ожидаете. Если есть фактические изменения, которые нужно извлечь (вместо «Уже обновлено»), то git pull завершится ошибкой, потому что не сможет найти рабочее дерево.

У вас есть несколько простых вариантов:

1) Вы можете просто выполнить git fetch часть операции, выполнив:

sudo -u dmalikov git --git-dir=/home/dmalikov/path/to/repo/.git fetch

который не дает никакой ошибки для меня.

2) В рабочее дерево можно добавить cd:

(cd /home/dmalikov/path/to/repo; sudo -u dmalikov git pull)
person amcnabb    schedule 26.03.2012
comment
Связано: git --git-dir не работает должным образом: stackoverflow.com/questions/1386291/ - person kenorb; 07.12.2012

Чтобы ответить на мой собственный комментарий, /root была интересной ошибкой

Чтобы он работал с --git-dir, вам также необходимо указать каталог рабочего дерева.

sudo -u dmalikov git --git-dir=/home/dmalikov/path/to/repo/.git --work-tree=/home/dmalikov/path/to/repo/.git pull
person bluesman    schedule 26.03.2012
comment
Ты на какой машине? Он будет использовать пути, специфичные для вашей системы (Windows или Linux). На моем локальном компьютере работает следующее (git bash в Windows) $ git --git-dir=/c/workspace/changes/.git --work-tree=/c/workspace/changes/ pull Already up-to-date. - person bluesman; 26.03.2012
comment
Попробуйте выполнить вашу команду из каталога, где вы не можете cd через пользователя без полномочий root. - person ДМИТРИЙ МАЛИКОВ; 26.03.2012

Я не думаю, что можно избежать этого компакт-диска, когда вы запускаете git с пользователем, у которого нет разрешения на изменение каталога обратно в текущий каталог, то есть / root. / как текущий каталог, очевидно, работает, поскольку у всех есть права на переход в этот каталог.

person ralphtheninja    schedule 24.03.2012
comment
Изменил мой ответ. Это связано с разрешениями, а не --work-tree, как я думал изначально. - person ralphtheninja; 24.03.2012