Как выполнить команду Git, не находясь в хранилище? - PullRequest
88 голосов
/ 22 августа 2011

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

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

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

Ответы [ 5 ]

155 голосов
/ 09 марта 2016

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

git -C /home/repo log

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

Edit:

Ответ понижен ... довольно удивительно, так как, строго говоря, это единственный правильный ответ на вопрос. Опции --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.

67 голосов
/ 22 августа 2011

Попробуйте:

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

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

fatal: Not a git repository
17 голосов
/ 21 апреля 2012

На самом деле вам нужно использовать --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
6 голосов
/ 25 октября 2017

Я пробовал много раз!Я наконец получил это!

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

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

-C dir

2 голосов
/ 21 июля 2016

Это похоже на ответ @ 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...