Показать информацию о git впереди и позади всех веток, включая удаленные - PullRequest
49 голосов
/ 15 октября 2011

В github-проекте вы можете перейти на страницу / branch и увидеть красивые графики, подобные этой, которые для каждой ветви показывают, насколько далеко позади и насколько далеко каждая ветка по отношению к мастеру.

git branch ahead behind

Есть ли инструмент командной строки, который делает что-то подобное?Что-то, что работает и с пультами?Например,

git branch -v -v

близко к тому, что я ищу, но работает только для локальных филиалов.

Ответы [ 2 ]

60 голосов
/ 15 октября 2011

Мне тоже было любопытно, поэтому я просто запустил скрипт git branch-status, который выдает эту информацию, используя git for-each-ref

#!/bin/bash
# by http://github.com/jehiah
# this prints out some branch status (similar to the '... ahead' info you get from git status)

# example:
# $ git branch-status
# dns_check (ahead 1) | (behind 112) origin/master
# master (ahead 2) | (behind 0) origin/master

git for-each-ref --format="%(refname:short) %(upstream:short)" refs/heads | \
while read local remote
do
    [ -z "$remote" ] && continue
    git rev-list --left-right ${local}...${remote} -- 2>/dev/null >/tmp/git_upstream_status_delta || continue
    LEFT_AHEAD=$(grep -c '^<' /tmp/git_upstream_status_delta)
    RIGHT_AHEAD=$(grep -c '^>' /tmp/git_upstream_status_delta)
    echo "$local (ahead $LEFT_AHEAD) | (behind $RIGHT_AHEAD) $remote"
done

Использование:

$ git branch-status
dns_check (ahead 1) | (behind 112) origin/master
master (ahead 2) | (behind 0) origin/master
38 голосов
/ 10 декабря 2013

Обновление 2015

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

С Git 2.5+ правильная команда:

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

Подробнее см. " Просмотр невыгруженных коммитов Git ".

(как указано void.pointer в в комментариях , upstream:track точнее, чем push:track, в зависимости от толчка по умолчанию policy )


В Git 2.13 (2-й квартал 2017 г.) используется более общий API ref-filter с более полным git for-each-ref push:

См. коммит 3d9e4ce , коммит 949af06 , коммит 56b4360 , коммит 6eac70f , коммит 1a34728 , коммит 1a0ca5e , commit 3a42980 , commit 17938f1 , commit 3ba308c , commit a798410 , commit b180e6f , commit 01f9582 , commit 7743fcc , commit ffd921d , commit 99c6a71 , commit d4919bb , commit 42d0eb0 , commit 4f3e3b3 , commit c58fc85 (10 января 2017 г.) Картик Наяк (KarthikNayak) .
(объединено Junio ​​C Hamano - gitster - в commit 93e8cd8 , 27 февраля 2017 г.)

push:

Имя локального ref, представляющего @{push} расположение для отображаемого ref.
Respect :short, :lstrip, :rstrip, :track и :trackshort, как upstream.
Создает пустую строку, если не настроено @{push} ref.

Если lstrip=<N>(rstrip=<N>) добавляется, разделяет <N> компоненты пути, разделенные косой чертой, с передней (задней) части refname
(например, %(refname:lstrip=2) превращает refs/tags/foo в foo и %(refname:rstrip=2) превращается refs/tags/fooв refs).

Если <N> - отрицательное число, удалите столько компонентов пути, сколько необходимо, с указанного конца, чтобы оставить -<N> компонентов пути
(например, %(refname:lstrip=-2) повороты refs/tags/foo в tags/foo и %(refname:rstrip=-1) превращает refs/tags/foo в refs)


Оригинальный ответ (2014)

Другой способ будет доступен с Git 1.9 /2/0 (1 квартал 2014 года).
См. commit b28061c из Рамкумар Рамачандра (артаньон) :

for-each-ref: ввести %(upstream:track[short])

Ввести:

  • %(upstream:track) для отображения «[ahead M, behind N]» и
  • %(upstream:trackshort) для отображения «=», «>», «<» или «<>» соответственно (вдохновленныйcontrib/completion/git-prompt.sh).

Теперь вы можете использовать следующий формат для for-each-ref:

%(refname:short) %(upstream:trackshort)

для отображения ссылок с краткой информацией отслеживания.

Обратите внимание, что :track и :trackshort работают только с "upstream", и выдает ошибку при использовании с чем-либо еще.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...