Як виконати команду Git, не перебуваючи у сховищі?


131

Чи є спосіб виконувати команди Git проти сховища, не перебуваючи в цьому сховищі?

Наприклад , що - щось на зразок цього: git /home/repo log?

Будь ласка, не кажіть мені cdце. Я роблю це через execдзвінок.


3
Ви не можете просто "cd / home / repo && git log" як ваш exec зателефонувати?
Олексій Хованський

У мене є деякі дивні проблеми з цим. Я починаю новий процес, насправді не exec, але я не знаю, чим вони відрізняються. Мені легше просто знайти параметр, щоб вказати каталог git.
Вежа



1
git --git-dir = / home / repo / .git log
Atiq Ur Rehman

Відповіді:


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. @Patrick Я нічого не проголосував?
Вежа

3
@Patrick Відповідь була відредагована (спочатку сказано, що --work-dirя думаю)
Гарет

1
Це не спрацювало для мене, оскільки показало, що всі файли комітету видалені. Схоже, це перевірка фіксації, але не вміст папки. Для кращих показників зверніться до відповіді @calandoa.
mxcd

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

1
це насправді не спрацювало так, як очікувалося чому це будь-яка прийнята відповідь? Це використовуватиме поточний dir як робоче дерево та використовувати вказаний .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

4
Опція -C була додана у версії 1.8.5 git, яка вийшла у 2013 році.
d5ve

-C працював краще, ніж --git-dir для мене ... -C відзначає налаштування git config для репо. У мене працює версія git 1.9.5.msysgit.1
Straff

@calandoa нам завжди потрібно вказувати місцеположення з кореня, ще одне, якщо ім'я репо містить кілька слів, як ми вводимо цей код
Kasun Siyambalapitiya

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 до свого

-С реж


3

Це схоже на відповідь @ max. На жаль, --git-dir не робив того, що мені потрібно. редагувати Заднім числом, ще одна [попередня] відповідь, яку я не читав, пропонував використовувати --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.