git - git-dir працює не так, як очікувалося


209

Я намагаюся запустити git з іншого каталогу, ніж я зараз. Наприклад, якщо я перебуваю в:

cd /home/domain/
git status << runs perfect ie
# On branch master
# Your branch is ahead of 'origin/master' by 6 commits.

Тому тепер я хочу запустити цю команду з іншого каталогу за допомогою --git-dirпараметра.

Тож скажемо, що я заходжу root/та спробуйте це:

git --git-dir="/home/domain/" status
## Error 
fatal: Not a git repository: '/home/domain/'

Я також намагався включити .gitпапку, тобто

git --git-dir="/home/domain/.git/" status

Але це виглядає так, що це намагається запустити git з кореня, тобто видалити все з моєї папки домену та додати все в root.

Сподіваюся, хтось може порадити, що я роблю неправильно.


4
Зараз у мене статус ідеально працює, але тягнення дає помилки. тобто root @ erx [/] # git --git-dir = / home / domain / .git --work-tree = / home / domain / pull origin master fatal: / usr / local / libexec / git-core / git -pull не можна використовувати без робочого дерева. Але статус працює ?? будь-які ідеї Джон
Лі

4
Це найбільша помилка в git зараз. Не дотримуючись параметрів --work-tree та / або --git-dir.
Адам Дімітрук

5
Починаючи git 1.8.5, у вас буде вибір не встановлювати, --git-dirа --work-treeпросту команду: дивіться мою відповідь нижче
VonC

Відповіді:


314

Ви також повинні визначити робочий директор. Заплутане я знаю, але це гнучкість.

git --git-dir=/mycode/.git --work-tree=/mycode status

Ви можете прочитати трохи більше тут


3
Спасибі це спрацювало! Погодився, що це заплутано. Його називають Keep It Simple Stupid. Ви майже завжди можете дозволити гнучкість, в той же час надаючи типові значення, які мають найбільш сенс, коли VS, що має команду, взагалі не працює.
Най

3
@ Нік погодився, ви б подумали, якщо --git-dirйого не вказано, він перевірить, чи /mycode/.gitіснує, і використовувати це, перш ніж викинути помилку.
GP89

4
@NickYeates відряджений! Також у мене виникли проблеми при використанні ~ для посилання на мою домашню директорію, наприклад, git --git-dir=~/src/s3cmd/.git --work-tree=~/src/s3cmd pullне вийшло, але git --git-dir=/home/username/src/s3cmd/.git --work-tree=/home/username/src/s3cmd pullзробив
Джеймі Кук,

1
Зауважте, що не всі команди вимагають робочого дерева, наприклад, "git --git-dir = / mycode / .git log" працює нормально. Домовились про те, що це заплутано!
yoyo

4
Невелике роз’яснення: git --git-dir="$HOME/foo/.git" --work-tree="$HOME/foo" status
Харіс Крайна

136

Починаючи з git 1.8.5 (який повинен вийти на наступному тижні), буде ще простіше:

 git -C "/home/domain/" status

Не потрібно встановлювати --git-dirі --work-treeбільше!


Див здійснювати 44e1e4 по Назрі Ramliy :

Потрібно більше натискань клавіш, щоб викликати команду git в іншому каталозі, не виходячи з поточного каталогу:

  1. (cd ~/foo && git status)
    git --git-dir=~/foo/.git --work-dir=~/foo status
    GIT_DIR=~/foo/.git GIT_WORK_TREE=~/foo git status
  2. (cd ../..; git grep foo)
  3. for d in d1 d2 d3; do (cd $d && git svn rebase); done

Методи, показані вище, прийнятні для сценаріїв, але занадто громіздкі для швидкого виклику командного рядка.

З цією новою опцією вищезазначене можна зробити за допомогою меншої кількості натискань клавіш:

  1. git -C ~/foo status
  2. git -C ../.. grep foo
  3. for d in d1 d2 d3; do git -C $d svn rebase; done

4
Мене зіткнули, намагаючись використовувати прапор -C після команди git (наприклад git status -C <path>, не вийде!)
Kedar Paranjape

42

На підставі вашого коментаря вище, це здається, що ви все ще стикаєтеся з проблемою:

root @ erx [/] # git --git-dir = / home / domain / .git --work-tree = / home / domain / master master origin
fatal: / usr / local / libexec / git-core / git-pull не можна використовувати без робочого дерева

Це здається, що ви, можливо, збираєтеся запустити це crontabчи щось. Можливо, вам зручніше cdспочатку перейти до робочого каталогу. Наприклад:

root @ erx [/] # (cd / home / domain && git pull master master)

Це тимчасово (у підзаділлі, що і робиться в дужках) змінить поточний каталог на /home/domain, а потім запуститься git pull origin master. Після завершення команди ваш поточний каталог залишається таким, яким він був перед командою.


Використовувати підскладку просто і елегантно. Я не знаю, чому я раніше про це не думав!
Ехтеш Чудхурі

Вибачте @Greg, проголосував іншу відповідь Джона, коли він відповів на поставлене запитання, - але я думаю, ви помітили, що помітили і відповіли про намір і своє розуміння, тобто () s, саме те, що я шукав +10
Даррен Єпископ

1
git --git-dir="/home/domain/" status
## Error 
fatal: Not a git repository: '/home/domain/'

З Git 2.26 (I квартал 2020 року) документація чіткіша.

Одним із ефектів визначення місця, де GIT_DIRзнаходиться (або із змінною оточення, або з параметром " git --git-dir=<where> cmd"), є відключення виявлення сховища .

Це додало трохи більше навантаження в документації, оскільки нові користувачі часто плутаються.

Див. Комісію d82ad54 (30 січня 2020 р.) Від Heba Waly ( HebaWaly) .
(Об'єднав Хуніо С Хамано - gitster- у комітеті 17e4a1b , 12 лютого 2020 р.)

git: оновлення документації для --git-dir

Підписаний: Хеба Уолі
Допоможений: Хуніо С Хамано

git --git-dir <path> трохи заплутано і іноді не працює, як очікував би користувач.

Наприклад, якщо користувач працює git --git-dir=<path> status, git буде пропускати алгоритм виявлення репозиторію і призначатиме дерево роботи поточному робочому каталогу користувача, якщо не вказано інше.
Якщо це призначення неправильне, вихід не відповідатиме очікуванням користувача.

Цей патч оновлює документацію, щоб зробити її більш зрозумілою.

Тож документаціяgit --git-dir наразі включає:

--git-dir=<path>:

Встановіть шлях до сховища (" .git" каталогу).
Це також можна контролювати, встановивши GIT_DIRзмінну середовища.
Це може бути абсолютний шлях або відносний шлях до поточного робочого каталогу.

Визначення місця розташування .gitкаталогу " " за допомогою цієї опції (або GIT_DIRзмінної середовища) вимикає відкриття сховища, яке намагається знайти каталог з .gitпідкаталогом " " (саме так виявлено сховище та верхній рівень робочого дерева), і повідомляє Git, що ви на верхньому рівні робочого дерева.

Якщо ви не перебуваєте в каталозі верхнього рівня робочого дерева, вам слід повідомити Git, де знаходиться верхній рівень робочого дерева, з --work-tree=<path>опцією (або GIT_WORK_TREEзмінною середовища)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.