git push -> просмотр кода только текущих изменений (remote.origin.push переопределяет push.default) - PullRequest
0 голосов
/ 18 октября 2018

Моя команда использует проверку кода Gerrit, по сути, это означает, что стандартное поведение push обходит стандартный рабочий процесс, поэтому вместо этого нам нужно использовать git push origin HEAD:refs/for/feature, чтобы правильно отправить наш код для проверки.

Стандартное поведение pushвыглядит следующим образом:

user$ git push --dry-run
To https://gerrit.company.url/project
   83fa2a5..aca3a22  feature -> feature

Это позволит обойти процесс проверки, который нежелателен.

Когда я устанавливаю push-ref-spec ( ссылка здесь ) равным refs/heads/*:refs/for/* это делает шаг в правильном направлении:

user $ git config remote.origin.push refs/heads/*:refs/for/*
user$ git push --dry-run
To https://gerrit.company.url/project
 * [new branch]      master -> refs/for/master
 * [new branch]      old_stuff -> refs/for/old_stuff
 * [new branch]      feature -> refs/for/feature

Теперь он пытается подтолкнуть feature к refs/for/feature, что я хочу, но он также пытается подтолкнуть все мои ветви к источнику.Геррит отклоняет более одного запроса, поэтому я получаю вывод, подобный следующему:

user$ git push
....
To https://gerrit.company.url/project
 ! [remote rejected] master -> refs/for/master (no new changes)
 ! [remote rejected] old_stuff -> refs/for/old_stuff (duplicate request)
 ! [remote rejected] feature -> refs/for/feature (duplicate request)

, но я обнаружил, что если я назову текущую ветвь, она сделает то, что ожидаю:

user $ git push origin feature --dry-run
To https://gerrit.company.url/project
 * [new branch]      feature -> refs/for/feature

Это здорово, и я смогу использовать это, но я бы хотел сузить это больше.Я подумал, что если установить push.default на current, это будет означать, что git push будет толкать только текущую ветвь таким образом, но к моему разочарованию:

user$ git config push.default current
user$ git push origin --dry-run
To https://gerrit.company.url/project
 * [new branch]      master -> refs/for/master
 * [new branch]      old_stuff -> refs/for/old_stuff
 * [new branch]      feature -> refs/for/feature

Это, кажется, игнорирует push.default параметр, Из документации git config :

push.default

Определяет действие, которое git push должно выполнить, если явно не указан refspecучитывая

Так что конфигурация remote.origin.push интерпретируется как явная ссылка на спецификацию?Даже при настройке поведения push по умолчанию на nothing он все равно пытается нажать на все ветви:

user$ git config push.default nothing
user$ git push
fatal: You didn't specify any refspecs to push, and push.default is "nothing".
user$ git config remote.origin.push refs/heads/*:refs/for/*
user$ git push origin --dry-run
To https://gerrit.company.url/project
 * [new branch]      master -> refs/for/master
 * [new branch]      old_stuff -> refs/for/old_stuff
 * [new branch]      feature -> refs/for/feature

Что мне здесь не хватает?Как мне заставить git push выдвинуть только текущую ветку, как feature -> refs/for/feature?

1 Ответ

0 голосов
/ 22 октября 2018

Я не верю, что то, что вы хотите сделать, можно сделать с помощью только git.

Я смог сузить его еще на один уровень, определив псевдонимы удаленного сервера в моем конфигурационном файле, как показано нижепо одному на каждую ветку, которую я мог бы нажать, но это, очевидно, утомительно и неприятно, и мне все еще приходится печатать что-то вроде git push masterrev.

    [remote "origin"]
        url = ssh://gerritserver/product
        fetch = +refs/heads/*:refs/remotes/origin/*
    [remote "masterrev"]
        url = ssh://gerritserver/product
        fetch = +refs/heads/*:refs/remotes/origin/*
        push = HEAD:refs/for/master

Единственный известный мне эквивалент, чтобы дать вам исходную цельэто инструменты сторонних разработчиков, такие как git-review , которые разработчики OpenStack собрали для собственного использования.Может быть, это того стоит, если ваша команда планирует использовать gerrit, поскольку она предоставляет другие функции, такие как легкий доступ к сбору вишен или проверке отзывов.

В качестве отступления, я считаю настройку push.default "«текущий» означает просто предположить, что локальные имена ветвей должны быть переданы через удаленную. *. push-модификацию, даже если они еще не известны на сервере.Он не ограничивает, какие ветви передаются только «текущему», а скорее использует «текущие» имена.

...