Git: проверить, если совершить XYZ в удаленном репо? - PullRequest
51 голосов
/ 05 апреля 2011

У меня есть коммит xyz в моей локальной ветке, который я хочу проверить, включен ли он в репозиторий удаленных выпусков; могу ли я сделать это каким-то простым способом? Я мог бы клонировать удаленное репо, но я надеюсь на более приятный и быстрый способ. git ls-remote казалось многообещающим, но не нашел для меня ничего ценного. Спасибо!

Ответы [ 3 ]

76 голосов
/ 05 апреля 2011

Предположим, что удаленный, который ссылается на удаленный репозиторий, называется origin.В этом случае сначала обновите все ваши ветви удаленного отслеживания с помощью:

git fetch origin

Теперь вы можете использовать полезную опцию --contains для git branch, чтобы выяснить, какая из удаленных веток содержит этот коммит:

git branch -r --contains xyz

(-r означает отображение только ветвей удаленного отслеживания.) Если фиксация xyz содержится в одной или нескольких ваших веток удаленного отслеживания, вы увидите вывод, подобный следующему:

  origin/test-suite
  origin/HEAD -> origin/master
  origin/master

Если он содержится в вашем локальном репозитории, но не в одной из веток удаленного отслеживания, выходные данные будут пустыми.Однако, если эта фиксация вообще не известна в вашем репозитории , вы получите ошибку malformed object name и сообщение об использовании - возможно, это немного сбивает с толку, если вы этого не ожидаете ...

10 голосов
/ 05 апреля 2011

Как сказал Марк,

 git branch -a --contains commitish

Однако, остерегайтесь веток, которые содержат выбранную / перебазированную / объединенную версию коммита.

Это может пригодиться

 git log --cherry-pick --left-right <commitish> ^remote/branchname

Будет отображен коммит ТОЛЬКО , если он не существует (как черпик) в удаленной ветви. См. Справочную страницу журнала для объяснения того, как --cherry-pick идентифицирует эквивалентные коммиты

Конечно, слияния / перебазирования с разрешениями конфликтов или сквошами не могут быть автоматически обнаружены, как это

1 голос
/ 13 ноября 2018

Существующие ответы требуют, чтобы весь удаленный репозиторий был загружен локально.Если у пульта есть много коммитов, которые еще не клонированы локально, это может занять очень много времени.Примером может служить что-то вроде linux-stable репозитория, в котором есть много независимых веток, которые никогда не объединяются.Кто-то, отслеживающий стабильное ядро ​​ , может клонировать только одну ветку для этого ядра.Необходимость извлечения всех ветвей для каждого ядра стабильной серии, чтобы увидеть, существует ли фиксация, потребует загрузки гораздо большего количества данных.

Похоже, что нет хорошего способа сделать это без извлечения всего удаленного репо,Возможность есть, основанная на способах работы git fetch-pack и git send-pack, но, кажется, нет способа использовать ее желаемым способом.

Перенос ветви в удаленный репозиторий делаетНе загруженные коммиты уже есть у удаленного, и это делается без предварительной загрузки всего удаленного репозитория.При попытке извлечь удаленный коммит не нужно загружать весь удаленный репозиторий, чтобы определить, существует ли запрошенный коммит или нет.

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

git fetch origin <commit ID>

Если на пульте нет этой фиксации, это не удастся.Для этого удаленное хранилище не нужно локально клонировать.Если на пульте есть коммит, то он его получает.Там нет выбора, просто посмотреть, будет ли выборка работать, но ничего не получить.Конечно, если фиксация уже доступна локально, то ничего не нужно извлекать, и это не является дорогостоящей операцией.

В некоторых удаленных репозиториях не допускается то, что не является заголовком ветви или тега.быть запрошеннымВ этом случае это не сработает.

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