Есть ли способ выполнить команды Git против репозитория, не находясь в этой папке репозитория?
Например, что-то вроде этого: git /home/repo log
?
Пожалуйста, не говорите мне cd
. Я делаю это с помощью вызова exec
.
Есть ли способ выполнить команды Git против репозитория, не находясь в этой папке репозитория?
Например, что-то вроде этого: git /home/repo log
?
Пожалуйста, не говорите мне cd
. Я делаю это с помощью вызова exec
.
Try:
git --git-dir=/home/repo/.git log
Важно указать путь до каталога .git вашего репозитория. В противном случае вы получите сообщение об ошибке:
fatal: Not a git repository
Используйте параметр -C
(docs):
git -C /home/repo log
Это почти эквивалентно --git-dir
и --work-tree
без добавления обычной папки .git
Edit:
Answer downvoted... довольно удивительно, поскольку, строго говоря, это единственный правильный ответ на вопрос. Параметры --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 -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
Это похоже на ответ @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
.
Я много раз пробовал! Я, наконец, получил это!
git -C dir --no-pager log --format='%an' -1 filename
помните, пожалуйста, не добавляйте .git к своему
-C dir