У git хук чи гарантовано поточний робочий каталог знаходиться у сховищі git?


81

Експериментально здається, що git хуки запускаються з поточним каталогом, встановленим як корінь сховища. Однак я не бачу жодної гарантії щодо цього в документації git. Чи слід покладатися на поточний робочий каталог для пошуку сховища git, чи є кращий спосіб опрацювати сховище git, пов'язане з хуком?


4
Не впевнений, наскільки це пов’язано. На стабільному вікні Gentoo з Git 2.7.3 (-r1) git-хуки не тільки виконуються, .gitале й git reset --hardфактично створюють робочу структуру каталогів усередині .gitкаталогу, що, на мій погляд, абсолютно невірне!
Павло Шимерда,

Відповіді:


45

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


6
Чи має $ GIT_DIR кінцеву скісну риску?
PuercoPop

8
Це НЕ правильна відповідь. GIT_DIR НЕ завжди встановлюється коренем репо. Дивіться цей блог .
Ghopper21,

2
@ Ghopper21 Ця стаття теж не зовсім коректна. Там сказано, що для гачка після фіксації поточний каталог - це верхній рівень робочого дерева. Однак мій дуже простий сценарій після фіксації не знайшов інших сценаріїв на верхньому рівні робочого дерева. наприклад:.git/hooks/post-commit: 1: .git/hooks/post-commit: post-commit_push_gitweb.sh: not found
Вінс

70

Поточні відповіді застарілі. Станом на 2.9.0 у документах зазначено таке:

Перш ніж Git викликає хук, він змінює свою робочу директорію або на корінь робочого дерева в непростому сховищі, або на $ GIT_DIR в голому сховищі.

https://git-scm.com/docs/githooks/2.9.0


12
Чудова відповідь. Пояснення було зроблено в наступних редакціях (2.13.0). "Виняток становлять хуки, що запускаються під час натискання (попереднє отримання, оновлення, пост-отримання, після оновлення, push-to-checkout), які завжди виконуються в $ GIT_DIR."
Novice C

2
Джерело / контекст для вищезазначеної цитати: git-scm.com/docs/githooks#_description
jmcker

1
Звичайною мовою: це каталог верхнього рівня вашого сховища. ("Голий" по суті відноситься до сховища, що складається лише з .gitкаталогу і без вивірених файлів.)
Бен Марес

4

Ви можете використовувати змінну середовища $GIT_DIR. $GIT_DIRвказує на .gitкаталог.


Наскільки ймовірно, що $GIT_DIR/..вказуватиме на корінь сховища?
Девід Лорд,

Це не надійно. Не використовуйте $GIT_DIR/... Це розірветься, коли репо буде оголеним репо. Голе репозиторій не має робочого каталогу, отже, не має і кореня сховища. Також він зламається, коли .git замість цього є посиланням.
Holygeek

1
Фігурний. Будь-який спосіб отримати корінь репо при звичайному використанні? Наприклад, для гачка перед фіксацією, який використовує репо як файли конфігурації програми?
David Lord

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