Je voulais faire la même chose. La meilleure solution que j'ai trouvée est celle de @MicTech. Cependant, comme l'a souligné @MotoWilliams, cette solution ne survit pas aux mises à jour du fichier .gitconfig effectuées par Git, qui remplace le lien par un nouveau fichier contenant uniquement les nouveaux paramètres.
J'ai résolu ce problème en écrivant le script PowerShell suivant et en l'exécutant dans le démarrage de mon profil script. À chaque exécution, il copie tous les paramètres qui ont été ajoutés au fichier .gitconfig de l'utilisateur vers le fichier global, puis remplace tout le texte du fichier .gitconfig par un en-tête [include] qui importe le fichier global.
Je conserve le fichier global .gitconfig dans un repo avec beaucoup d'autres scripts et outils globaux. Tout ce que j'ai à faire, c'est de me rappeler de vérifier les changements que le scripts ajoute à mon fichier global.
Cela semble fonctionner de manière assez transparente pour moi. J'espère que cela vous aidera !
9 septembre : Mis à jour pour détecter quand les nouvelles entrées ajoutées au fichier de configuration sont des doublons et les ignorer. Ceci est utile pour des outils comme SourceTree qui écrivent de nouvelles mises à jour s'ils ne trouvent pas celles qui existent et ne suivent pas les includes.
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
}
0 votes
Je voulais juste ajouter que je rencontre aussi ce problème. J'ai tous mes autres éléments de configuration globale de git ("exludesfiles" et "attrirutesfile") dans %userprofile%/.git/.gitignore (donc dans un dossier), mais le .gitconfig, j'aimerais qu'il soit juste à côté, mais il doit être à la racine de %userprofile% c'est vraiment ennuyeux.
7 votes
Des progrès depuis que la question a été posée ? Mon fichier .gitconfig se trouve par défaut sur un lecteur réseau, ce qui signifie qu'il ne peut pas le lire lorsque je suis hors ligne.
0 votes
La véritable question qui se pose est la suivante : pourquoi voulez-vous faire cela ?