Получение информации отслеживания для ветки 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:rstrip=-1) превращает refs/tags/foo в refs). Когда в ссылке недостаточно компонентов, результатом становится пустая строка при удалении с положительным(например,%(refname:lstrip=-2) превращают refs/tags/foo в tags / foo или полное имя ссылки при удалении с отрицательным . Это тоже не ошибка.
Некоторые примеры:
Формат:
"%(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)