Используйте команду git «log» в другой папке

128

У меня есть несколько файлов php в папке A (это проект git). В этом php-файле я хочу выполнить «git log», но для папки B. Папка B - это еще один проект git (поэтому журнал отличается от A и B).

Как я могу сделать это с помощью команды оболочки?

Орелиен Б
источник
3
cd /other/dir && git log && cd -в оболочке bash?
Takehin
1
С git 1.8.5 (4 квартал 2013 г.) у вас будет другой выбор вместо настройки --git-dir: см. Мой ответ ниже
VonC
Возможный дубликат git pull, когда он не находится в каталоге git
Code-Apprentice

Ответы:

189

От man git,:

Вы можете сделать это с помощью --git-dirпараметра перед передачей каких-либо команд.

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

( .gitНеобходимо указать каталог.) Из документации :

--git-dir=<path>

Задайте путь к репозиторию. Этим также можно управлять, задав GIT_DIRпеременную среды. Это может быть абсолютный или относительный путь к текущему рабочему каталогу.

rgngl
источник
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 работает намного лучше.
Calimo
146

С git 1.8.5 (4 квартал 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
VonC
источник
19
Это гораздо более надежный подход и работает для команд, отличных от log.
Воздух
вау, и ничего на странице руководства! Какая жалость. (хорошо, теперь я вижу, что это добавлено на странице
руководства
К сожалению, это все еще не так хорошо, как -Rвариант Mercurial , поскольку он портит относительные пути. Например, если я печатаю, 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», я не имею в виду «кроме случаев, сделайте что-нибудь еще».
underscore_d