Получение информации отслеживания для ветки Git

Как я могу получить информацию отслеживания (например, удаленное имя и имя ветки) о конкретной локальной ветке Git, желательно с помощью одной команды? Кажется, есть много способов сделать это, например

git rev-parse --abbrev-ref --symbolic-full-name branch_name@{upstream}

Однако он возвращает восходящий поток в форме 'origin/branch_name', что затрудняет определение отдельных частей (например, когда удаленное имя или имя ветки содержит '/'). Есть ли более надежное решение, желательно с использованием одной команды Git?

2 ответа

Решение

RomainVALERI в ответе предложил эту команду для отображения информации отслеживания.

git for-each-ref --format="%(upstream:short)" refs/heads/<yourBranch>

Однако, если вы хотите избавиться от косой черты, вы можете сделать это

git for-each-ref --format="%(upstream:remotename) %(upstream:lstrip=-1)"  \ 
# Insert your separator here                     ^
refs/heads/<yourBranch>

Из git-docs,

вверх по течению

Имя локальной ссылки, которую можно рассматривать как восходящую по сравнению с отображаемой ссылкой. Уважает: short ,: lstrip и: rstrip так же, как и refname выше...

Для любой ветви удаленного отслеживания%(восходящий поток), %(восходящий поток: удаленное имя) и%(восходящий поток: удаленная ссылка) относятся к имени удаленного устройства и имени отслеживаемого удаленного ссылки соответственно. Другими словами, ветвь удаленного отслеживания может быть обновлена ​​явно и индивидуально с помощью refspec %(upstream:remoteref):%(upstream) для выборки из%(upstream:remotename).

Подробнее об lstrip,

Если добавлено lstrip= (rstrip= ), компоненты пути, разделенные косой чертой, удаляются из передней (задней) части ссылки (например,%(refname:lstrip=2) превращает refs/tags/foo в foo и%(refname:rstrip=2) превращает refs/tags/foo в refs). Если - отрицательное число, удалите столько компонентов пути, сколько необходимо, с указанного конца, чтобы оставить - компоненты пути (например,%(refname:lstrip=-2) превращают refs/tags/foo в tags / foo и %(refname:rstrip=-1) превращает refs/tags/foo в refs). Когда в ссылке недостаточно компонентов, результатом становится пустая строка при удалении с положительным или полное имя ссылки при удалении с отрицательным . Это тоже не ошибка.


Некоторые примеры:

  • Формат: "%(upstream:remotename):%(upstream:lstrip=-1)"

    Выход: <remote-name>:<branch-name>

  • Формат: "%(upstream:remotename) %(upstream:lstrip=-1)"

    Выход: <remote-name> <branch-name>


Если в названии ветки есть косая черта, то lstripне сработает. Вместоremoteref может быть использован.

git for-each-ref --format="%(upstream:remotename) %(upstream:remoteref)" refs/heads/<yourBranch>

Вывод находится в таком формате: <remote-name> refs/heads/<branch-name>

Удалять refs/heads/ из вывода передайте указанную выше команду этому

sed 's/refs\/heads\///g'

Я бы использовал встроенный -v (многословно) или даже -vv (очень подробный) флаг, чтобы получить это от git branchвыход. Вы также можете просто ввести имя ветки с помощью grep, чтобы сосредоточиться на том, что вы хотели:

git branch -vv | grep <branchName>

В зависимости от того, что именно вы хотите получить, возможно, также рассмотрите возможность использования сантехнического инструмента:

git for-each-ref --format="%(upstream:short)" refs/heads/<yourBranch>

и сделайте его псевдонимом для удобства

git config --global alias.get-rem '!f() { git for-each-ref --format="%(upstream:short)" refs/heads/$1; }; f'

# then just
git get-rem branch_name

Изменить: для очень короткой части (т.е."branch" вместо того, чтобы "refs/remotes/origin/branch" или даже "origin/branch"), вы можете использовать %(upstream:lstrip:-1) вместо того %(upstream:short)

Другие вопросы по тегам