Я хотел сделать то же самое. Лучшее, что я мог найти, было решение @ MicTech. Однако, как отмечает @MotoWilliams, это не выдерживает никаких обновлений, сделанных Git в файле .gitconfig, который заменяет ссылку новым файлом, содержащим только новые настройки.
Я решил эту проблему, написав следующий скрипт PowerShell и запустив его в своем скрипте запуска профиля. Каждый раз, когда он запускается, он копирует все параметры, которые были добавлены в .gitconfig пользователя, в глобальный, а затем заменяет весь текст в файле .gitconfig заголовком и [include], который импортирует глобальный файл.
Я храню глобальный файл .gitconfig в репозитории вместе со многими другими глобальными скриптами и инструментами. Все, что мне нужно сделать, это не забыть проверить любые изменения, которые скрипт добавляет в мой глобальный файл.
Мне кажется, это работает довольно прозрачно. Надеюсь, это поможет!
9 сентября: Обновлено, чтобы обнаруживать дубликаты новых записей, добавленных в файл конфигурации, и игнорировать их. Это полезно для таких инструментов, как SourceTree, которые будут писать новые обновления, если они не могут найти существующие и не следуют включенным.
function git-config-update
{
$localPath = "$env:USERPROFILE\.gitconfig".replace('\', "\\")
$globalPath = "C:\src\github\Global\Git\gitconfig".replace('\', "\\")
$redirectAutoText = "# Generated file. Do not edit!`n[include]`n path = $globalPath`n`n"
$localText = get-content $localPath
$diffs = (compare-object -ref $redirectAutoText.split("`n") -diff ($localText) |
measure-object).count
if ($diffs -eq 0)
{
write-output ".gitconfig unchanged."
return
}
$skipLines = 0
$diffs = (compare-object -ref ($redirectAutoText.split("`n") |
select -f 3) -diff ($localText | select -f 3) | measure-object).count
if ($diffs -eq 0)
{
$skipLines = 4
write-warning "New settings appended to $localPath...`n "
}
else
{
write-warning "New settings found in $localPath...`n "
}
$localLines = (get-content $localPath | select -Skip $skipLines) -join "`n"
$newSettings = $localLines.Split(@("["), [StringSplitOptions]::RemoveEmptyEntries) |
where { ![String]::IsNullOrWhiteSpace($_) } | %{ "[$_".TrimEnd() }
$globalLines = (get-content $globalPath) -join "`n"
$globalSettings = $globalLines.Split(@("["), [StringSplitOptions]::RemoveEmptyEntries)|
where { ![String]::IsNullOrWhiteSpace($_) } | %{ "[$_".TrimEnd() }
$appendSettings = ($newSettings | %{ $_.Trim() } |
where { !($globalSettings -contains $_.Trim()) })
if ([string]::IsNullOrWhitespace($appendSettings))
{
write-output "No new settings found."
}
else
{
echo $appendSettings
add-content $globalPath ("`n# Additional settings added from $env:COMPUTERNAME on " + (Get-Date -displayhint date) + "`n" + $appendSettings)
}
set-content $localPath $redirectAutoText -force
}