Git Pulling зависит от текущего каталога - PullRequest
18 голосов
/ 24 марта 2012

Я пытаюсь 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 pull ing?

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

Ответы [ 3 ]

17 голосов
/ 26 марта 2012

В первом примере команда 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)
2 голосов
/ 26 марта 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
0 голосов
/ 24 марта 2012

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

...