windows - Sådan ændres SYMLINK til SYMLINKD i batch script

Indlæg af Hanne Mølgaard Plasc

Problem



Vi deler SYMLINKD-filer på vores git-projekt. Det virker næsten, medmindre git ændrer vores SYMLINKD-filer til SYMLINK-filer, når de trækkes på en anden maskine.


For at være klar, på den oprindelige maskine, oprettes symlink ved hjælp af kommandoen:


mklink /D Annotations ....submodulesAnnotationsAssets


På den originale maskine vises dir cmd:


25/04/2018  09:52    <SYMLINKD>     Annotations [....submodulesAnnotationsAssets]


Efter kloning på modtageren får vi


27/04/2018  10:52    <SYMLINK>      Annotations [....submodulesAnnotationsAssets]


Som du måske gæt gæt en fil måltype, der peger på en en mappe [[.... \ submodules \ Annotations \ Assets]] , ikke fungerer korrekt.


For at løse dette problem skal vi enten:



  1. Forhindre git mod at ændre vores symlink typer.

  2. Løs vores symlinks med batch script udløst på en githook



Vi kommer til os 2, da vi ikke ønsker at kræve, at alle brugere bruger en ændret version af git.


Min begrænsede viden om batch scripting forhindrer mig. Indtil videre har jeg kigget på blot at ændre attriben af ​​filen ved hjælp af info her:
Sådan får du attributter til en fil ved hjælp af batch-filen og https://superuser.com/questions/653951/how-to-remove-read-only-attribute-recursively-on-windows-7. [9]


Kan nogen foreslå, hvilke attrib kommandoer jeg har brug for at ændre symlink?


Alternativt indser jeg, at jeg kan slette og genskabe symlinket, men hvordan får jeg målkataloget til den eksisterende symlink kort for at bruge kommandoen dir og analysere stien fra outputen?

Bedste reference


Jeg tror det er https://github.com/git-for-windows/git/issues/1646.[10]


For at være klarere: Dit spørgsmål ser ud til at være en manifestation af XY-problemet: Git-eksemplet, der bruges til at klone/hente projektet, ser ud til at fejlagtigt behandle symbolske links til kataloger, der skaber symbolske links, der peger på filer i stedet . Så det ser ud til at være en fejl i GfW, så i stedet for at grave det op har du opfundet en løsning og spørg hvordan man får det til at fungere. [11]


Så jeg vil bedre forsøge at hjælpe GfW maintainer og den som rapporterede # 1646 for at løse problemet. Hvis du har brug for en stop-gap løsning, vil jeg sige en ordentlig måde ville være at gå en anden rute og script flere opkald til git ls-tree for at finde ud af, hvad katalogsymbolerne er (de 'har et særligt sæt tilladelsesbits;
du kan starte her). [12]


Så du ville krydse alle trægenstande fra HEAD begå, rekursivt,
finde ud af, hvad symlinksne peger på mapper er og derefter
fiksér de matchende poster i arbejdstræet ved sletning dem
og genskabe med mklink /D eller hvad der skaber en korrekt form for
symlink.


Desværre er jeg 'bange for at prøve at scribe dette ved hjælp af lame muligheder
af cmd.exe s scripting faciliteter ville være en øvelse i forgæves.
Jeg vil tage nogle mere 'rigtige' programmeringssprog (PowerShell som et eksempel,
og da du sandsynligvis er en Windows-butik - selv et .NET ville være OK).