Laden...

git config - includeif matcht nie

Erstellt von Palladin007 vor einem Jahr Letzter Beitrag vor einem Jahr 822 Views
Palladin007 Themenstarter:in
2.079 Beiträge seit 2012
vor einem Jahr
git config - includeif matcht nie

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.

16.833 Beiträge seit 2008
vor einem Jahr

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...

Palladin007 Themenstarter:in
2.079 Beiträge seit 2012
vor einem Jahr

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.

Palladin007 Themenstarter:in
2.079 Beiträge seit 2012
vor einem Jahr

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.

16.833 Beiträge seit 2008
vor einem Jahr

Meinung?

Du stehst auf Schmerzen. Aber dafür verurteile ich Dich nicht 😉

Palladin007 Themenstarter:in
2.079 Beiträge seit 2012
vor einem Jahr

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.