Moin moin,
Ich habe nach einer Windows-Neuinstallation ein Problem mit meinem git-Setup - das includeif matcht nie 😠
Git habe ich mit Hilfe des Visual Studio Installers installiert, Version: 2.38.1.windows.1
Ich habe auf einem anderen Laufwerk einen Source-Ordner, in dem es wiederum mehrere Unterordner gibt und jeder dieser andere Unterordner enthält Projekte, die eine eigene config (z.B. email & name) brauchen.
Aus dem Grund habe ich mit Hilfe der globalen .gitconfig im Profil eingerichtet, dass die .gitconfig-Dateien aus jedem Unterordner abhängig vom Verzeichnis hinzugefügt werden.
Folgendes setup:
> C:\Users<user>.gitconfig
# Alle vier Varianten habe ich getestet
[includeIf "gitdir/i:N:/Source/"]
path = N:/Source/.gitconfig
[includeIf "gitdir:N:/Source/"]
path = N:/Source/.gitconfig
[includeIf "gitdir/i:N:/Source/**"]
path = N:/Source/.gitconfig
[includeIf "gitdir:N:/Source/**"]
path = N:/Source/.gitconfig
> N:/Source/.gitconfig
[includeIf "gitdir/i:./Foo/"]
path = ./Foo/.gitconfig
> N:/Source/Foo/.gitconfig
foo=bar
Wenn ich nun aus dem Pfad "N:\Source\Foo\Bar" heraus "git config -l --show-origin" ausführe, ist das Ergebnis:
file:C:/Users/<user>/.gitconfig includeif.gitdir/i:N:/Source/.path=N:/Source/.gitconfig
file:C:/Users/<user>/.gitconfig includeif.gitdir:N:/Source/.path=N:/Source/.gitconfig
file:C:/Users/<user>/.gitconfig includeif.gitdir/i:N:/Source/.path=N:/Source/.gitconfig
file:C:/Users/<user>/.gitconfig includeif.gitdir:N:/Source/.path=N:/Source/.gitconfig
Auffällig ist, dass die "N:/Source/.gitconfig" scheinbar gar nicht eingelesen wird.
Wenn ich beiden Dateien das "includeif" durch ein simples "include" austausche:
file:C:/Users/<user>/.gitconfig include.path=N:/Source/.gitconfig
file:N:/Source/.gitconfig include.path=./Foo/.gitconfig
file:N:/Source/./Foo/.gitconfig foo=bar
Siehe da, es funktioniert.
Vor der Windows-Neuinstallation hat's auch funktioniert, aber der einzigen Unterschied, den ich finden kann, ist, dass ich vorher die git-Version 2.37.1 installiert hatte.
Mit Version 2.37.1 (hatte sie noch aus einer Sicherung und konnte sie kopieren) funktioniert es aber auch nicht, ich hab also irgendwas anderes falsch gemacht.
Hat jemand eine Idee, was das sein könnte oder kennt einen Weg, wie ich genaueres herausfinden kann?
Beste Grüße
NuGet Packages im Code auslesen
lock Alternative für async/await
Beim CleanCode zählen nicht die Regeln, sondern dass wir uns mit diesen Regeln befassen, selbst wenn wir sie nicht befolgen - hoffentlich nach reiflichen Überlegungen.
Ich kann Dir da nur meine Erfahrung geben: mich hat das Git-Verhalten mit den Configs irgendwann so sehr genervt, dass ich keine globalen Configs mehr verwende, sondern dann halt bewusst (meist einmalig) die Identity setze...
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
Naja, nicht die Antwort, die ich lesen wollte, aber irgendwie hab ich damit gerechnet.
Das beseitigt auch das Problem, dass Visual Studio immer die globale .gitconfig überschreibt 😁
NuGet Packages im Code auslesen
lock Alternative für async/await
Beim CleanCode zählen nicht die Regeln, sondern dass wir uns mit diesen Regeln befassen, selbst wenn wir sie nicht befolgen - hoffentlich nach reiflichen Überlegungen.
Ich hab mich mal mit Powershell ausgetobt und ein Skript gebaut, was mir das (und mehr) automatisiert.
Einfach das Skript mit URL und (optional) Ziel-Verzeichnis aufrufen und er sucht nach einer Datei, aus der er einen Token (GitHub) liest, schreibt den Token in die URL, klont das ganze Repository und ergänzt anschließend noch eine git-config im Repository. Beide Dateien werden "nach oben" gesucht, sodass man einfach im Parent-Ordner eine Datei anlegt.
Dazu dann noch ein Haufen Parameter, weil ich hardcoded Zeug nicht mag ^^
Mir gefällt nicht, dass ich dafür einen GitHub-Token brauche und der im Klartext und ungeschützt in der config steht, aber aktuell habe ich keinen anderen Weg, wie ich mir mehreren GitHub-Accounts umgehen soll, Visual Studio kommt damit nicht klar und der Cridentials Manager auch nicht, daher der Token.
Und SSH kann's auch nicht, mal schauen, ob ich da noch mehr mache, bisher hab ich nur HTTP genutzt.
Meinung?
<#
.DESCRIPTION
Clone a repository from a given http url into a new directory.
If a token file is found, its content is taken as UserInfo in the URL.
If a config file is found, it is included for the cloned repository.
.PARAMETER url
The HTTP-URL to the repository.
.PARAMETER target
The target folder where the repository should be placed.
.PARAMETER ignoreToken
Do *not* add a GitHub-Token to the url.
.PARAMETER ignoreConfig
Do *not* include a config file in the new repository.
.PARAMETER absoluteConfig
The config file will be included with an absolute path.
.PARAMETER token
The token to be used.
If this parameter has a value, no token file will be searched.
.PARAMETER tokenFile
Searches for a file with the specified name in the directory structure above the current location and uses the contents as url user info.
.PARAMETER configFile
Searches for a file with the specified name in the directory structure above the current location and includes the file in the cloned git config.
#>
Param(
[Parameter(Mandatory)]
[ValidateNotNullOrEmpty()]
[string]$url,
[Parameter()]
[string]$target = $null,
[Parameter()]
[switch]$ignoreToken = $false,
[Parameter()]
[switch]$ignoreConfig = $false,
[Parameter()]
[switch]$absoluteConfig = $false,
[Parameter()]
[string]$token = $null,
[Parameter()]
[ValidateNotNullOrEmpty()]
[string]$tokenFile = ".gittoken",
[Parameter()]
[ValidateNotNullOrEmpty()]
[string]$configFile = ".gitconfig"
)
$ErrorActionPreference = "Stop"
$script = {
if (-not $target) {
$target = [IO.Path]::GetFileNameWithoutExtension($url)
}
if (-not $ignoreToken) {
if (-not $token) {
$token = Read-File-From-Above -file $tokenFile
}
if ($token) {
Write-Output "Prepare url with token"
$url = Url-With-UserInfo -url $url -userInfo $token
} else {
Write-Output "Warning: Could not find token file: $tokenFile"
}
}
git clone $url $target
if (-not $ignoreConfig) {
$configFilePath = Get-Path-Of-File-Above -file $configFile
if ($configFilePath) {
$gitFolder = $target + "/.git"
if ($absoluteConfig) {
$configFilePath = Resolve-Path $configFile
} else {
$configFilePath = Get-Relative-Path -path $configFilePath -relativeTo $gitFolder
}
Write-Output "Include config file"
git config -f $gitFolder/config include.path $configFilePath
} else {
Write-Output "Warning: Could not find config file: $configFile"
}
}
}
function Get-Relative-Path {
param (
[string]$path,
[string]$relativeTo = $null
)
if ($relativeTo) {
$previousLocation = Get-Location
Set-Location $relativeTo
}
try {
$path = Resolve-Path -Relative $path
} finally {
if ($previousLocation) {
Set-Location $previousLocation
}
}
return $path
}
function Read-File-From-Above {
param (
[string]$file
)
$file = Get-Path-Of-File-Above -file $file
if ($file) {
return Get-Content -Path $file
}
return $null
}
function Get-Path-Of-File-Above {
param (
[string]$file,
[string]$folder = $null
)
if (-not $folder) {
$folder = Get-Location
}
$fileName = Split-Path $file -Leaf
$file = Join-Path $folder $fileName
if (Test-Path $file -PathType Leaf) {
return Resolve-Path $file
}
$folder = Split-Path $folder
if (-not $folder) {
return $null
}
return Get-Path-Of-File-Above -folder $folder -file $fileName
}
function Url-With-UserInfo {
param (
[string]$url,
[string]$userInfo
)
$uri = New-Object -TypeName System.Uri -ArgumentList $url, [System.UriKind]::Absolute
return "$($uri.Scheme)://$($userInfo)@$($uri.Host):$($uri.Port)$($uri.PathAndQuery)"
}
& $script
NuGet Packages im Code auslesen
lock Alternative für async/await
Beim CleanCode zählen nicht die Regeln, sondern dass wir uns mit diesen Regeln befassen, selbst wenn wir sie nicht befolgen - hoffentlich nach reiflichen Überlegungen.
Meinung?
Du stehst auf Schmerzen. Aber dafür verurteile ich Dich nicht 😉
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
Warum?
Weil Powershell? 😁
NuGet Packages im Code auslesen
lock Alternative für async/await
Beim CleanCode zählen nicht die Regeln, sondern dass wir uns mit diesen Regeln befassen, selbst wenn wir sie nicht befolgen - hoffentlich nach reiflichen Überlegungen.