2014-07-02 4 views
1

Я хотел бы видеть последние n коммитов (обычно 1 или 2) для всех локальных ветвей в моем репозитории.Как получить git для отображения последних n коммитов из всех локальных ветвей

Я пробовал «git log -1 --all» и «git log -1 --branches», но это не имеет эффекта, которого я ожидаю в git 1.8.4.

В основном я хотел бы эквивалент

for i in $(ls .git/refs/heads/); do echo ====$i====; git log -1 $i; done 
+0

Что не так с решением, которое у вас уже есть? – Chris

+1

Почему вы не делаете из него псевдоним? – kaman

+0

Если «активные ветви» вы имеете в виду «те, чьи ссылки не были перемещены в упакованные refs или обновлены с тех пор», приведенное выше - более или менее путь. Возможно, вы захотите добавить что-то, чтобы обрабатывать имена ветвей со встроенными слэшами. – torek

ответ

0

Получение списка с каждой отрасли и их последний коммит может быть достигнута с помощью:

git branch -vv

Если вы хотите что-то более подробно, или переменное количество коммитов для возврата, ваше собственное решение уже довольно хорошо. Вы можете создать GIT псевдоним для него, добавив следующее ~/.gitconfig:

[alias]                   
    log-all-branches = "!sh -c 'git_dir="$(git rev-parse --show-toplevel)/.git/refs/heads/"; for i in $(ls $git_dir); do echo ====$i====; git log -n $1 $i; done' -" 

Теперь вы можете получить последние 2 фиксаций для каждой отрасли, выполнив git log-all-branches 2

+0

Это хороший старт, но точка OP, связанная с необходимостью находиться в корневом каталоге, является хорошей. Возможно, вы захотите включить 'git rev-parse -git-dir'. – Chris

+0

Спасибо за указание. После того как ОП указал это в комментариях к своему вопросу, я адаптировал команду в своем ответе на это. –

1

Local (т.е. «не удаленный ") - те, чье имя ссылки начинается с refs/heads/.

Команда git for-each-ref предназначена для перебора референс-имен, так что, как правило, вещь для использования:

git for-each-ref --format='%(refname:short)' refs/heads 

напечатает их всех. Обратите внимание, что вы не можете просто передать это значение git log -1, хотя это остановится после регистрации одной фиксации из первой ссылки; поэтому вам нужно что-то вроде того, что вы сделали. Есть множество способов, чтобы построить это, например .:

git for-each-ref --format '%(refname:short)' refs/heads | \ 
    while read branch; do git log -1 $branch; done 

или:

git for-each-ref --format='git log -1 %(refname:short)' refs/heads | sh 

Во втором случае вы должны добавить --shell, чтобы убедиться, что все расширения цитируются. Это защищает, например, от ветви с именем foo$bar.

Смежные вопросы