.gitattributes



  • Moin,
    kann man eigentlich Eigenschaften in .gitattributes auf Basis des Dateityps setzen? Ich hab da nämlich ein Shellscript ohne Dateiendung, das sollte auf eol=lf gesetzt werden.


  • Mod

    Ich denke nicht, nur Namenmuster. Dateien haben keinen "Typen". Alle Dateien sind nur Bytefolgen. Wie man die interpretiert ist reine Konvention.

    Aber Gegenfrage: Heißt das, du hast autocrlf auf false gesetzt? Du Monster!



  • @SeppJ Natürlich haben Dateien Typen, zumindest unter Linux. Da gibt es das file tool, um den Typen anzuzeigen.

    file greatest_script_ever
    greatest_script_ever: Bourne-Again shell script, ASCII text executable
    file $(which clang)
    /usr/bin/clang: symbolic link to ../lib/llvm-14/bin/clang
    

    Standardmäßig hab ich die Zeilenenden auf auto, aber für shell scripts brauch ich generell eol=lf, unabhängig vom OS.



  • Öhm Wieso änderst du das shell script namen nicht dass es eine dateiendung hat (z.b. *.sh)
    Oder du setzt den kompletten dateinamen in .gitattributes



  • @firefly Weil dann der Kunde auch alles ändern muss. Kompletter Dateiname ginge natürlich, müsste aber dann für jedes einzeln Skript gemacht werden.
    Ich hatte halt gehofft, dass es da eine Lösung gibt, da es ja unüblich is Shellscripts eine Endung zu verpassen.


  • Mod

    @Tyrdal sagte in .gitattributes:

    @SeppJ Natürlich haben Dateien Typen, zumindest unter Linux. Da gibt es das file tool, um den Typen anzuzeigen.

    So ein Unsinn. file rät nur anhand des Inhalts, was das wohl sein könnte. Wie gesagt: Reine Konvention und Interpretationssache.

    Standardmäßig hab ich die Zeilenenden auf auto, aber für shell scripts brauch ich generell eol=lf, unabhängig vom OS.

    Aber dann hast du es doch? Ich weiß jetzt nicht, was du mit "auto" meinst, aber wenn du damit die normale Standardeinstellung (true unter Windows, input unter allen anderen), dann ist doch alles im Repo immer mit lf abgespeichert.

    edit: Oder meinst du, das ausgecheckte Script unter Windows soll auch nur lf haben? Während alles andere cr+lf behält? Falls ja: Warum? Unter Windows würde ein Script doch auch cr+lf erwarten.



  • @SeppJ sagte in .gitattributes:

    file rät nur anhand des Inhalts, was das wohl sein könnte.

    Nicht "nur". Ob es ein Link ist oder nicht, wird z.B. aus dem Dateisystem ermittelt. "There are three sets of tests, performed in this order: filesystem tests, magic tests, and language tests. The first test that succeeds causes the file type to be printed." -- aber dein wesentlicher Punkt ist natürlich trotzdem richtig.



  • @SeppJ sagte in .gitattributes:

    @Tyrdal sagte in .gitattributes:

    @SeppJ Natürlich haben Dateien Typen, zumindest unter Linux. Da gibt es das file tool, um den Typen anzuzeigen.

    So ein Unsinn. file rät nur anhand des Inhalts, was das wohl sein könnte. Wie gesagt: Reine Konvention und Interpretationssache.

    Nö, der Shebang gibt doch den Interpreter an. Was gibts da zu raten?

    Standardmäßig hab ich die Zeilenenden auf auto, aber für shell scripts brauch ich generell eol=lf, unabhängig vom OS.

    Aber dann hast du es doch? Ich weiß jetzt nicht, was du mit "auto" meinst, aber wenn du damit die normale Standardeinstellung (true unter Windows, input unter allen anderen), dann ist doch alles im Repo immer mit lf abgespeichert.

    edit: Oder meinst du, das ausgecheckte Script unter Windows soll auch nur lf haben? Während alles andere cr+lf behält? Falls ja: Warum? Unter Windows würde ein Script doch auch cr+lf erwarten.

    Letzteres. Wenn ich das Script mal eben aus nem WSL2 raus aufrufe wird sich über das cr am Ende des Shebang bzw. der Zeile beschwert.



  • Also ich persönlich finde das automatische Konvertieren von Line-Endings grässlich. Ich drehe das grundsätzlich ab. Komplett.

    @SeppJ

    Oder meinst du, das ausgecheckte Script unter Windows soll auch nur lf haben? Während alles andere cr+lf behält? Falls ja: Warum? Unter Windows würde ein Script doch auch cr+lf erwarten.

    Ein Grund wäre wenn man z.B. WSL verwendet. Oder ne VM verwendet wo man die Working-Copy rein mountet. Den Checkout macht man dann mit Windows, greift dann aber mit Linux auf die Files zu. Und Linux will halt einfach LF in den Shell-Scripts.


  • Mod

    @hustbaer sagte in .gitattributes:

    Also ich persönlich finde das automatische Konvertieren von Line-Endings grässlich. Ich drehe das grundsätzlich ab. Komplett.

    @SeppJ

    Oder meinst du, das ausgecheckte Script unter Windows soll auch nur lf haben? Während alles andere cr+lf behält? Falls ja: Warum? Unter Windows würde ein Script doch auch cr+lf erwarten.

    Ein Grund wäre wenn man z.B. WSL verwendet. Oder ne VM verwendet wo man die Working-Copy rein mountet. Den Checkout macht man dann mit Windows, greift dann aber mit Linux auf die Files zu. Und Linux will halt einfach LF in den Shell-Scripts.

    Das wäre ja ein Fall dafür, es auf input/false zu setzen, weil man effektiv unter non-Windows arbeitet.

    @Tyrdal sagte in .gitattributes:

    Nö, der Shebang gibt doch den Interpreter an. Was gibts da zu raten?

    Jedes Shellscript fängt mit Shebang an? Nein. Eine Datei darf nie mit Shebang losgehen, wenn sie kein Shellscript ist? Auch Nein. Außerdem ist "Shellscript-Sein" nach wie vor keine Eigenschaft der Datei, sondern des Inhalts.



  • @SeppJ sagte in .gitattributes:

    @hustbaer sagte in .gitattributes:

    Also ich persönlich finde das automatische Konvertieren von Line-Endings grässlich. Ich drehe das grundsätzlich ab. Komplett.

    @SeppJ

    Oder meinst du, das ausgecheckte Script unter Windows soll auch nur lf haben? Während alles andere cr+lf behält? Falls ja: Warum? Unter Windows würde ein Script doch auch cr+lf erwarten.

    Ein Grund wäre wenn man z.B. WSL verwendet. Oder ne VM verwendet wo man die Working-Copy rein mountet. Den Checkout macht man dann mit Windows, greift dann aber mit Linux auf die Files zu. Und Linux will halt einfach LF in den Shell-Scripts.

    Das wäre ja ein Fall dafür, es auf input/false zu setzen, weil man effektiv unter non-Windows arbeitet.

    Aber doch nicht für alles. Die anderen Datein sollen auf auto bleiben, weil auch unter Windows genutzt.

    @Tyrdal sagte in .gitattributes:

    Nö, der Shebang gibt doch den Interpreter an. Was gibts da zu raten?

    Jedes Shellscript fängt mit Shebang an? Nein. Eine Datei darf nie mit Shebang losgehen, wenn sie kein Shellscript ist? Auch Nein. Außerdem ist "Shellscript-Sein" nach wie vor keine Eigenschaft der Datei, sondern des Inhalts.

    Und der Inhalt definiert den Type. Ist aber auch wurscht wenn du deine unübliche Meinung vertrittst. man file sagt jedenfalls, dass ein file type ermittelt wird. Letztlich hilft mir das aber nicht weiter.



  • Vllt. hilft dir die Antwort in Files without extensions in .gitattributes?



  • Ich hab jetzt einfach mit find, file etc den angeblich nichtexistenten file type ermittelt und die Namen der Shellskripte in die .gitattributes umgeleitet. Wenn eins dazu kommt muss man es halt händisch nachtragen.

    fd -t f | xargs file --mime-type |rg shellscript|sed "s/^\.\///;s/:.*$/ text eol=lf/" >> .gitattributes
    


  • @Tyrdal sagte in .gitattributes:

    Ich hab jetzt einfach mit find, file etc den angeblich nichtexistenten file type ermittelt und die Namen der Shellskripte in die .gitattributes umgeleitet.

    Streich das "angeblich"!

    Mach doch mal eine Datei namens "xxx" mit dem Inhalt:

    #include <stdio.h>
    int main() { using x = int; puts("42\n"); }
    

    Das ist offenbar C++. Wenn du file befragst, kommt "C source" raus. Woran sollte file jetzt auch erkennen, dass es C++ ist? File versucht so gut wie möglich zu raten, was du für eine Datei hast.



  • @wob sagte in .gitattributes:

    @Tyrdal sagte in .gitattributes:

    Ich hab jetzt einfach mit find, file etc den angeblich nichtexistenten file type ermittelt und die Namen der Shellskripte in die .gitattributes umgeleitet.

    Streich das "angeblich"!

    Mach doch mal eine Datei namens "xxx" mit dem Inhalt:

    #include <stdio.h>
    int main() { using x = int; puts("42\n"); }
    

    Das ist offenbar C++. Wenn du file befragst, kommt "C source" raus. Woran sollte file jetzt auch erkennen, dass es C++ ist? File versucht so gut wie möglich zu raten, was du für eine Datei hast.

    Woran machst du denn fest, dass es ein C++ file ist? Am Inhalt kann man das nicht erkennen. Das Beispiel ist ein wenig sehr konstruiert.



  • @Tyrdal sagte in .gitattributes:

    Woran machst du denn fest, dass es ein C++ file ist? Am Inhalt kann man das nicht erkennen

    "using" gibt es in C nicht. Es könnte auf eine "Textdatei" sein, die zufällig von C++ kompiliert werden kann. Oder eben C mit Fehlern. Das kann file nicht wissen. Das ist genau der Punkt. Du behauptest, file würde das irgendwie wissen können. Kann es nicht. Genau wie es ein shell-Script sein könnte. Eines mit sehr vielen Fehlern.

    Das Beispiel ist ein wenig sehr konstruiert.

    Es ging um die Frage, dass git sicher erkennen soll, ob es sich um ein Shellscript handelt. Ist zum Beispiel eine Datei, wo jemand mit #!/usr/binbash in die erste Zeile geschrieben hat, ein Shellscript? Musst du dazu nicht den Inhalt angucken und wissen, was es sein soll?



  • @wob sagte in .gitattributes:

    @Tyrdal sagte in .gitattributes:

    Woran machst du denn fest, dass es ein C++ file ist? Am Inhalt kann man das nicht erkennen

    "using" gibt es in C nicht.

    Oh, das hatte ich übersehen.

    Es könnte auf eine "Textdatei" sein, die zufällig von C++ kompiliert werden kann.

    C++ Quellcode ist üblicherweise Text.

    Das Beispiel ist ein wenig sehr konstruiert.

    Es ging um die Frage, dass git sicher erkennen soll, ob es sich um ein Shellscript handelt.

    Und das zu ermitteln ginge prinzipell. Meine Skripte haben das üblich shebang.



  • Mal ne Frage, wenn es keinen Dateityp gibt, warum hat dann jeder Fileexplorer eine Spalte dafür?



  • @Tyrdal sagte in .gitattributes:

    Und das geht. Meine Skripte haben das üblich shebang.

    DEINE Scipte mögen das haben. Es gibt aber vielleicht auch scripte, diese Zeile nicht haben. Der Nutzer ruft sie mit bash scriptauf.

    Mal ne Frage, wenn es keinen Dateityp gibt, warum hat dann jeder Fileexplorer eine Spalte dafür?

    Und was wird da angezeigt, wenn du die Datei umbenennst? Oder den Inhalt änderst? Geht das teilweise vielleicht nur über die Dateiendung?! Wird dir vielleicht auch mal "Image" angezeigt, wenn es eine in "klickmich.gif" umbenannte ausführbare Datei ist?



  • @wob sagte in .gitattributes:

    @Tyrdal sagte in .gitattributes:

    Und das geht. Meine Skripte haben das üblich shebang.

    DEINE Scipte mögen das haben. Es gibt aber vielleicht auch scripte, diese Zeile nicht haben. Der Nutzer ruft sie mit bash scriptauf.

    Ja und? Es geht mir nur um meine Skripte.

    Mal ne Frage, wenn es keinen Dateityp gibt, warum hat dann jeder Fileexplorer eine Spalte dafür?

    Und was wird da angezeigt, wenn du die Datei umbenennst? Oder den Inhalt änderst? Geht das teilweise vielleicht nur über die Dateiendung?! Wird dir vielleicht auch mal "Image" angezeigt, wenn es eine in "klickmich.gif" umbenannte ausführbare Datei ist?

    Ist doch egal. Es gibt sowas wie einen Type. Ob der nun durch die Endung oder was auch immer gekennzeichnet wird ist doch unerheblich.


Anmelden zum Antworten