git - обновление пультов - нужно ли указывать название пультов?

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

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

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

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

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

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

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

1 ответ

Решение

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

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

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

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

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

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

Также обратите внимание, что каждый пульт может определять как URL, так и push-URL. Эти имена конфигурации не чувствительны к регистру, поэтому вы должны сворачивать регистр при поиске любого remote.remote.url а также remote.remote.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-адресах не должно быть пробелов. Я использовал приведенные выше кавычки для обработки случаев, когда они могут. (The git remote Команда не позволяет вам добавить пульт с пустым именем, но допускает пустое пространство в URL.) Очевидно, бесполезное использование "сортировки" - для обработки крайних случаев: если .git/config файл очень большой, мы можем попытаться запустить git config изменить конфигурацию при git config --get-regexp все еще читает и печатает старую конфигурацию. На практике это, вероятно, не нужно.

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