Використовуйте команду git “log” в іншій папці


128

У мене є кілька файлів php у папці A (що є проектом git). У цих файлах php я хочу виконати "git log", але для папки B. Folder B - це ще один проект git (тому журнал відрізняється між A і B).

Як я можу це зробити за допомогою команди оболонки?


3
cd /other/dir && git log && cd -в баш-шкаралупі?
takehin

1
З git 1.8.5 (Q4 2013) у вас буде інший вибір замість налаштування --git-dir: дивіться мою відповідь нижче
VonC

Відповіді:


189

Від man git,:

Це можна зробити за допомогою --git-dirпараметра, перш ніж передавати будь-які команди.

git --git-dir /foo/bar/.git log

( .gitНеобхідно вказати каталог.) З документації :

--git-dir=<path>

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


26
Ви повинні посилатися на .gitкаталог. Спробуйте git --git-dir=/foo/bar/.git log.
mipadi

6
Вибачте, мою помилку ви не ставите = - - git-dir та ім'я каталогу. так це стає git --git-dir / foo / bar log
rgngl

23
Увага! Цей підхід порушується для інших операцій, ніж log. Спробуйте git --git-dir /foo/someclone/.git status- git заплутався повністю. Рекомендую, -Cяк зазначено нижче.
Повітря

Я ще не стикався з довідковою сторінкою git, яка містить рядок "--git-dir": '(
thinsoldier

1
@thinsoldier man gitробить у моїй системі (2.3.5). Але відповідь @VonC працює набагато краще.
Калімо

145

З git 1.8.5 (Q4 2013) у вас буде інший вибір, замість налаштування --git-dir.
Якщо ви хочете виконати git logв папці B, введіть:

git -C B log

Так само, як " make -C <directory>", " git -C <directory> ..." каже Git піти туди, перш ніж робити щось інше .


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

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

  1. (cd ~/foo && git status)
    git --git-dir=~/foo/.git --work-tree=~/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

19
Це набагато надійніший підхід і працює для інших команд, ніж log.
Повітря

вау, і нічого на сторінці людини! Який сором. (нормально, зараз я бачу, що додано на 2,7 сторінок)
akostadinov

На жаль, це все ще не так приємно, як -Rваріант Меркуріалу , оскільки воно заплутує відносні шляхи. Наприклад, якщо я набираю, git -C subdir log subdir/myfileвона видає помилку (оскільки шукає файл subdir/subdir/myfile).
jwd

--git-dir зручніше, коли ви робите щось подібне:for p in (find . -type d -name ".git"); do git --git-dir $p ...; done
shabunc

1
@jwd: Я не впевнений, як це проблема? Те, що ви цитували, - це я точно очікував би поведінку, і я не хотів gitби вважати, що вона розумніша за мене і те, що я набрав. Якщо я скажу "запустити це в каталозі X", я не маю на увазі "за винятком випадків, зроби щось інше".
підкреслюй_d
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.