git - обновление пультов - нужно ли указывать название пультов?
Я пишу скрипт для обновления нескольких сотен удаленных репозиториев из-за изменения URL для нашего внутреннего хостинга кода.
Некоторые из этих репозиториев имеют другое удаленное имя (т. Е. Отличается от источника). Протестировали, не предоставляя имя удаленного, и обновленный пульт может быть проверен, но я не понимаю поведение.
- Это необычно?
- Что произойдет, если есть 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
все еще читает и печатает старую конфигурацию. На практике это, вероятно, не нужно.