git - git-dir работает не так, как ожидалось

209

Я пытаюсь запустить Git из другого каталога, чем я в. Так, например, если я в:

cd /home/domain/
git status << runs perfect ie
# On branch master
# Your branch is ahead of 'origin/master' by 6 commits.

Итак, теперь я хочу запустить эту команду из другого каталога, используя --git-dirопцию.

Итак, скажем, я в root/и попробуйте это:

git --git-dir="/home/domain/" status
## Error 
fatal: Not a git repository: '/home/domain/'

Я также попытался включить .gitпапку, т.е.

git --git-dir="/home/domain/.git/" status

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

Надеюсь, кто-то может посоветовать, что я делаю не так.

подветренный
источник
4
Теперь я получил статус отлично работает, но тянуть дает ошибки. т.е. root @ erx [/] # git --git-dir = / home / domain / .git --work-tree = / home / domain / master источника фатальной информации: / usr / local / libexec / git-core / git -Pull не может быть использован без рабочего дерева. А статус работает ?? любые идеи Джон
Ли
4
Это самая большая ошибка в git сейчас. Несоблюдение параметров --work-tree и / или --git-dir.
Адам Димитрук
5
Начиная с git 1.8.5, у вас будет выбор не устанавливать --git-dirи --work-treeдля простой команды: см. Мой ответ ниже
VonC

Ответы:

315

Вы также должны определить рабочий каталог. Смущает, я знаю, но это гибкость.

git --git-dir=/mycode/.git --work-tree=/mycode status

Вы можете прочитать немного больше здесь

Джон Гретар
источник
3
Спасибо, это сработало! Договорились, что это сбивает с толку. Это называется Keep It Simple Stupid. Вы почти всегда можете позволить гибкость, в то же время задавая значения по умолчанию, которые наиболее разумны, если команда не работает вообще.
Нет,
3
@ Ник согласился, вы бы подумали, что если --git-dirон не указан, он проверит, /mycode/.gitсуществует ли, и использует это, прежде чем выдать ошибку.
GP89
4
@NickYeates поддержали! Кроме того, у меня была проблема при использовании ~ для обозначения домашнего каталога, например , git --git-dir=~/src/s3cmd/.git --work-tree=~/src/s3cmd pullне работает , но git --git-dir=/home/username/src/s3cmd/.git --work-tree=/home/username/src/s3cmd pullсделал
Джейми Кук
1
Обратите внимание, что не все команды требуют рабочего дерева, например, "git --git-dir = / mycode / .git log" работает нормально. Договорились об этом, хотя путают!
yoyo
4
Небольшое уточнение: git --git-dir="$HOME/foo/.git" --work-tree="$HOME/foo" status
Харис Краина
136

Начиная с git 1.8.5 (который должен выйти на следующей неделе), будет еще проще:

 git -C "/home/domain/" status

Не нужно устанавливать --git-dirи --work-treeбольше!


Смотрите коммит 44e1e4 от Назри Рамлия :

Требуется больше нажатий клавиш, чтобы вызвать команду git в другом каталоге, не выходя из текущего каталога:

  1. (cd ~/foo && git status)
    git --git-dir=~/foo/.git --work-dir=~/foo status
    GIT_DIR=~/foo/.git GIT_WORK_TREE=~/foo git status
  2. (cd ../..; git grep foo)
  3. for d in d1 d2 d3; do (cd $d && git svn rebase); done

Методы, показанные выше, приемлемы для сценариев, но слишком громоздки для быстрых вызовов командной строки.

С помощью этой новой опции, вышеупомянутое может быть сделано с меньшим количеством нажатий клавиш:

  1. git -C ~/foo status
  2. git -C ../.. grep foo
  3. for d in d1 d2 d3; do git -C $d svn rebase; done
VonC
источник
4
Я получил Вступивший пытаюсь использовать флаг -C после команды мерзавца (например , git status -C <path>не будет работать!)
Кедар Paranjape
42

Исходя из вашего комментария выше, кажется, что вы все еще сталкиваетесь с проблемой:

root @ erx [/] # git --git-dir = / home / domain / .git --work-tree = / home / domain / мастер происхождения оригинала
Неустранимый: / usr / local / libexec / git-core / git-pull нельзя использовать без рабочего дерева

Похоже, вы собираетесь запустить это crontabили что-то в этом роде. Возможно, вам лучше использовать cdсначала переключение на ваш рабочий каталог. Например:

root @ erx [/] # (cd / home / domain && git pull master origin)

Это временно (в подоболочке, что и делают круглые скобки), изменит текущий каталог на /home/domainи затем запустит git pull origin master. После завершения команды ваш текущий каталог останется таким, каким он был до команды.

Грег Хьюгилл
источник
Использование подоболочки простое и элегантное. Я не знаю, почему я не думал об этом раньше!
Этеш Чоудхури
К сожалению @Greg, проголосовали другой ответ, Джон , как он ответил на вопрос спросил , - но я думаю , что вы на месте с пятнистость и ответить на намерение и ваше понимание т.е. () с, это именно то , что я искал +10
Даррен Бишоп
1
git --git-dir="/home/domain/" status
## Error 
fatal: Not a git repository: '/home/domain/'

С Git 2.26 (первый квартал 2020 года) документация стала понятнее.

Одним из следствий указания, где GIT_DIRнаходится (либо с помощью переменной среды, либо с помощью параметра « git --git-dir=<where> cmd»), является отключение обнаружения хранилища .

Это было уделено немного больше внимания документации, так как новые пользователи часто путаются.

См. Коммит d82ad54 (30 января 2020 г.) Хеба Вали ( HebaWaly) .
(Слиты Junio C Hamano - gitster- в фиксации 17e4a1b , 12 февраля 2020)

git: обновить документацию для --git-dir

Подписано: Хеба Вали.
Помощник: Джунио С. Хамано.

git --git-dir <path> это немного сбивает с толку и иногда не работает, как ожидал бы пользователь.

Например, если пользователь запускается git --git-dir=<path> status, git пропустит алгоритм обнаружения хранилища и назначит рабочее дерево текущему рабочему каталогу пользователя, если не указано иное.
Если это назначение неверно, вывод не будет соответствовать ожиданиям пользователя.

Этот патч обновляет документацию, чтобы сделать ее более понятной.

Итак, документация наgit --git-dir данный момент включает в себя:

--git-dir=<path>:

Установите путь к хранилищу ( .gitкаталог " ").
Это также можно контролировать путем установки GIT_DIRпеременной среды.
Это может быть абсолютный или относительный путь к текущему рабочему каталогу.

Указание местоположения .gitкаталога " " с помощью этой опции (или GIT_DIRпеременной среды) отключает обнаружение хранилища, которое пытается найти каталог с .gitподкаталогом " " (именно так обнаруживаются хранилище и верхний уровень рабочего дерева), и сообщает Git, что вы находитесь на верхнем уровне рабочего дерева.

Если вы не находитесь в каталоге верхнего уровня рабочего дерева, вы должны указать Git, где находится верхний уровень рабочего дерева, с --work-tree=<path>опцией (или GIT_WORK_TREEпеременной окружения)

VonC
источник