Как выполнить команду Git, не находясь в репозитории?


131

Есть ли способ выполнять команды Git для репозитория, не находясь в этом репозитории?

Например что-то вроде этого git /home/repo log:?

Пожалуйста, не говорите мне cdоб этом. Я делаю это по execзвонку.


3
Разве вы не можете просто "cd / home / repo && git log" в качестве вызова exec?
Alex Howansky

У меня с этим какие-то странные проблемы. Я начинаю новый процесс, на самом деле не исполнительный директор, но я не знаю, чем они отличаются. Мне проще найти параметр для указания каталога git.
Tower



1
git --git-dir = / home / repo / .git log
Атик Ур Рехман

Ответы:


102

Пытаться:

git --git-dir=/home/repo/.git log

Важно указать путь до каталога .git вашего репозитория. В противном случае вы получите только сообщение об ошибке, в котором говорится что-то вроде:

fatal: Not a git repository

2
Я продолжаю получать fatal: Not a git repository (or any of the parent directories): .git. @ Патрик. Я ничего не голосовал против?
Tower

3
@Patrick Ответ был отредактирован (изначально было сказано, что --work-dirя думаю)
Гарет

1
У меня это не сработало, так как все файлы коммита были удалены. Похоже, он проверяет фиксацию, но не содержимое папки. Обратитесь к ответу @calandoa для повышения производительности.
mxcd

2
У меня не получилось использовать последнюю версию git, однако с использованием опции -C это сработало, например: git -C /home/repo/.git log
D.Snap

1
на самом деле это не сработало, как ожидалось. почему это принятый ответ? Это будет использовать текущий каталог в качестве рабочего дерева и использовать указанный .git для истории, что совершенно неверно. Если вы не просто показываете логи, например git status,. -Cэто правильный путь.
Ван

218

-CВариант использования ( документы ):

git -C /home/repo log

Это почти эквивалентно --git-dirи --work-treeбез добавления обычной .gitпапки

Редактировать:

Ответ отрицательный ... довольно удивительный, поскольку, строго говоря, это единственно правильный ответ на вопрос. Параметры --git-dirи --work-treeне существуют для доступа к репозиторию извне рабочего дерева, они используются для перемещения в .gitдругое место, и в некоторых случаях их гораздо сложнее использовать.

Например, чтобы получить журнал /home/repo/subdirтолько:

git -C /home/repo/subdir log .

или

git -C /home/repo log subdir

Невозможно использовать log .с --git-dirили --work-tree. Путь должен быть обработан для извлечения подпути относительно вершины рабочего дерева, и даже в этом случае git не распознает его как путь, если вы не используете эту --опцию, поэтому единственный возможный способ:

git --git-dir /home/repo/.git log -- subdir

Кроме того, --work-treeв logмоей версии (git 1.9.1) не работает с подкомандой. Это просто игнорируется:

git --git-dir /home/repo/.git --work-tree /home/repo/subdir log -- subdir
git --git-dir /home/repo/.git --work-tree /home/repo/whatever log -- subdir

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


Спасибо за добавление дополнительных объяснений.
Эрик Г. Хагстром

git stashявляется еще одним примером подкоманде , который терпит неудачу , если --git-dirи --work-treeиспользуются.
d5ve 03

4
Параметр -C был добавлен в версию 1.8.5 git, выпущенную в 2013 году.
d5ve,

-C сработал для меня лучше, чем --git-dir ... -C соблюдает настройки конфигурации git для репо. Бегаю GIT версии 1.9.5.msysgit.1
Straff

@calandoa, нам всегда нужно указывать местоположение из корня, еще одна вещь, если имя репо содержит несколько слов, как мы вставляем этот код
Касун Сиямбалапития

17

На самом деле вам нужно использовать --git-dir и --work-tree вместе. Вот пример:

local [] Desktop: mkdir git
local [] Desktop: cd git
local [] git: touch README.txt
local [] git: git init
Initialized empty Git repository in /Users/albert/Desktop/git/.git/
local [] git: cd ..
local [] Desktop: git --work-tree=git --git-dir=git/.git add .
local [] Desktop: git --work-tree=git --git-dir=git/.git commit -a -m 'initial commit, called from outside the git directory'
[master (root-commit) ee951b1] initial commit, called from outside the git directory
0 files changed, 0 insertions(+), 0 deletions(-)
create mode 100644 README.txt
local [] Desktop: cd git
local [] git: git log --pretty=oneline
ee951b161053e0e0948f9e2a36bfbb60f9c87abe initial commit, called from outside the git di

1
Это более правильно, чем ответ только с --git-dir. git-scm.com/blog/2010/04/11/environment.html
Эрик Г. Хагстром,

11

Я много раз пробовал! Наконец-то я понял!

git -C dir --no-pager log --format='%an' -1 filename

помните, пожалуйста, не добавляйте .git в свой

-C директ


3

Это похоже на ответ @ max. К сожалению, --git-dir не сделал то, что мне нужно. edit Оглядываясь назад, можно сказать, что еще один [предыдущий] ответ, который я не читал, предлагается использовать --work-tree. Я не уверен, что лучше использовать среду или флаги, поэтому я оставлю свой ответ на случай, если кто-то найдет в нем применение, но я перейду на использование --work-tree/ --git-dir.


Есть два репозитория, один внутри другого, но не подмодуль; внешнее репо игнорирует это:

tools (outer repo)
  gcc/4.9.2 (inner repo)

Я хотел получить результат git rev-parse --show-prefixотносительно внешнего репо. Вот что я придумал (синтаксис bash; разбить по строкам для удобства чтения):

prefix_dir=$(cd ..; git rev-parse --show-toplevel)
prefix_dir=$(GIT_WORK_TREE=${prefix_dir} git rev-parse --show-prefix)

При выполнении из 4.9.2 он создает строку gcc/4.9.2.


1

Для любой команды git вы можете:

git --git-dir=<PATH-TO-REPO>/.git --work-tree=<PATH-TO-REPO> <git-command>

Например, если вы хотите сделать статус git:

 git --git-dir=/home/myrepo/.git --work-tree=/home/myrepo/  status

или если вы хотите проверить ветку, в которой находится репо:

git --git-dir=/home/myrepo/.git --work-tree=/home/myrepo/  rev-parse --abbrev-ref HEAD
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.