Чи є спосіб виконувати команди Git проти сховища, не перебуваючи в цьому сховищі?
Наприклад , що - щось на зразок цього: git /home/repo log?
Будь ласка, не кажіть мені cdце. Я роблю це через execдзвінок.
Чи є спосіб виконувати команди Git проти сховища, не перебуваючи в цьому сховищі?
Наприклад , що - щось на зразок цього: git /home/repo log?
Будь ласка, не кажіть мені cdце. Я роблю це через execдзвінок.
Відповіді:
Спробуйте:
git --git-dir=/home/repo/.git log
Важливо надати шлях увесь шлях до .git каталогу вашого сховища. Інакше ви отримаєте лише повідомлення про помилку, яке говорить приблизно:
fatal: Not a git repository
fatal: Not a git repository (or any of the parent directories): .git. @Patrick Я нічого не проголосував?
--work-dirя думаю)
git status. -Cце правильний шлях.
-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використовується.
Насправді вам потрібно використовувати - 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 не робив того, що мені потрібно. редагувати Заднім числом, ще одна [попередня] відповідь, яку я не читав, пропонував використовувати --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 ви можете:
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