git - обновление пультов - нужно ли указывать название пультов? - PullRequest
0 голосов
/ 13 июня 2018

Я пишу скрипт для обновления нескольких сотен удаленных репозиториев из-за изменения URL для нашего внутреннего хостинга кода.

Некоторые из этих репозиториев имеют другое удаленное имя (т. Е. Отличается от источника).Протестировали, не предоставляя имя удаленного, и обновленный пульт может быть проверен, но я не понимаю поведение.

  1. Это необычно?
  2. Что произойдет, если есть 2 или более пультов?

Предпочтительнее обновить пульты более четко определенным способом, и я попытался использовать bash для извлечения имени источника:

Какой символ между удаленным именем и адресом указан ниже?

$ git remote -v
origin  ssh://git@code_hosting_site.com/project_name/repo_name.git (fetch)
      ^^

Спасибо за любую помощь.

1 Ответ

0 голосов
/ 13 июня 2018

Это нормально?

"Нормально" - это смешное слово.Трудно определить, является ли это нормальным .Немного необычно иметь один пульт и не иметь его с именем origin, но это не ошибка , это просто нечетный .

Что произойдет, если есть 2 или более пультов?

Это зависит от вас.git remote -v перечислит их все, так что, конечно, их можно извлечь таким образом.Вы также можете использовать:

git config --get-regexp 'remote\..*'

, чтобы перечислить их все.Возможно, вы даже захотите добавить --local, чтобы убедиться, что в списке указаны только пульты, определенные в локальном файле .git/config, в случае, если какой-то сумасшедший пользователь определил пульт в своей глобальной конфигурации.(Я предполагаю, что вы не хотите пытаться обновить какие-либо такие записи.)

Также обратите внимание, что каждый пульт может определять как URL, так и push URL .Эти имена конфигурации не чувствительны к регистру, поэтому вы должны сворачивать регистр при поиске любых remote.<em>remote</em>.url и remote.<em>remote</em>.pushurl настроек «вручную» (если вы пишете свой собственный код для чтения файла config), но вы этого не делаетеВам нужно беспокоиться об этом при использовании git config --get-regexp или git remote -v, так как они делают сгибание регистра для вас.

Следовательно, скрипт sh или bash для чтения вывода git config --get-regexp может использовать:

# fix - called with URLs that may need fixing. Argument $1 is the
# type (url or pushurl), argument $2 is the remote, $3 is the URL itself.
fix() {
    local urltype=$1 remote="$2" url="$3"
    local newurl

    case $3 in
    ...) newurl="echo $url | sed ...";;
    *) return;;
    esac
    git config "remote.$remote.$urltype" "$newurl"
}

git config --local --get-regexp 'remote\..*' | sort | while read -r lhs rhs; do
    set -- $(echo $lhs | sed 's/\./ /g')
    case $3 in
    url|pushurl) fix $3 "$2" "$rhs";;
    esac
done

(В bash можно быть немного более любопытным; все вышеперечисленное работает в POSIX sh, хотя все это довольно непроверено. Конечно, вам также необходимо заполнить части ....)

Как правило, в удаленных именах и URL-адресах не должно быть пробелов.Я использовал кавычки выше для обработки случаев, когда они могут.(Команда git remote не позволяет вам добавить пульт с пустым именем, но допускает пустое пространство в URL.) Очевидно, бесполезное использование «сортировки» - для обработки крайних случаев: если .git/config файл очень большой, мы можем попытаться запустить git config на изменить конфигурацию, пока git config --get-regexp все еще читает и печатает старую конфигурацию.На практике это, вероятно, не нужно.

...