2010-11-20 2 views
13

Kann git leere Versionen einiger Dateien festschreiben? Der Fall ist, dass ich neue (nicht geordnete) Dateien zuerst als leere Dateien hinzugefügt und festgeschrieben werden muss, um ihre Inhalte als neu und zu überprüfen (die vollständigen, nicht aufgezeichneten Dateien sollten nicht hinzugefügt werden zum Index; git diff sollte die neu hinzugefügten Inhalte anzeigen, indem die Datei mit ihrer festgeschriebenen leeren Version verglichen wird).Kann git "leere Versionen" neuer Dateien festschreiben?

Es gibt git add -N file…, die file mit einem leeren Inhalt in dem Index setzt, aber das sagt nur, dass filewird hinzugefügt werden und git commit beklagt, dass die Datei nicht hinzugefügt wurde. Die Sache ist, dass die aktuelle, nicht leere Version nicht das ist, was hinzugefügt werden muss, sondern nur eine leere Version der neuen Datei.

Gibt es eine Möglichkeit, dies zu tun?

PS: Diese Frage wird im Kontext eines Programms gestellt, das automatisch Dateien zu einem Git-Repository hinzufügt (mein Programm folgt dem Code, den Schüler schreiben). Nicht freigegebener Code ist Code, den ich noch genehmigen muss. Daher sollte der Zustand, in dem ein von einem Studenten erstelltes Programm gestartet wird, der leere-Status sein, obwohl mein Programm gerade ein neues, nicht leeres Programm in ihrem Basisverzeichnis gefunden hat; Dies geschieht, indem automatisch eine neue, leere Version einer neuen Student-Programmdatei in einem Git-Repository übergeben wird. Daher erscheinen neue Codezeilen, die sie schreiben, als neu hinzugefügte Inhalte, verglichen mit der letzten festgeschriebenen Git-Revision.

+1

ich ehrlich gesagt nicht Ihr Problem verstehen. 'Berühre leere Datei && git addiere leere Datei && git commit' funktioniert für mich. – joschi

+0

'git diff' funktioniert perfekt für eine neu erstellte Datei. Wenn Sie einen Zustand unterscheiden, in dem die Datei nicht mit einem Diff existiert, wenn sie Inhalt hat, werden Sie alle Zeilen sehen, die genau so diff sind wie gegen eine leere Datei. (Nur die Modelines sind anders.) – Cascabel

+1

@joschi: Das Problem ist, dass ich viele neue, * nicht leere * Dateien habe. Die Verwendung von Svens Ansatz Nr. 1 ist umständlicher als die Verwendung seines ordentlichen Git-Installations-Ansatzes. – EOL

Antwort

29

Um ehrlich zu sein, ich verstehe nicht wirklich, wofür das nützlich ist. Ich würde versuchen, den Review-Prozess zu reparieren, anstatt die Geschichte durcheinander zu bringen. Aber wenn du das wirklich tun wollen, sind hier mehrere Möglichkeiten, wie:

  1. Der pragmatische Ansatz:

    mv file out-of-way 
    touch file 
    git add file 
    mv out-of-way file 
    
  2. Der Porzellan Ansatz:

    git add -N file 
    git add -p file 
    

    ... und nur antworten Sie mit "Nein", wenn Sie gefragt werden, ob das einzelne Hunk hinzugefügt werden soll.

  3. Der Sanitär-Ansatz:

    Erstens, stellen Sie sicher, dass ein leeres Objekt existiert in der Objektdatenbank:

    git hash-object -w --stdin < /dev/null 
    

    Dies wird die SHA1 eines leeren Blob zurückkehren (die e69de29bb2d1d6434b8b29ae775ad8c2e48c5391). Sie müssen dieses Objekt nur einmal anlegen. Jetzt können Sie leere Dateien im Index erstellen, indem

    git update-index --add --cacheinfo 0644 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 file 
    
+0

@Sven: Vielen Dank ! Der Klempner Ansatz ist perfekt für mich: Es ist leicht zu automatisieren, und auf den Punkt (die zweite Rate, warum ich das brauchen würde, ist jedoch nicht so relevant :)). Dies ist nützlich, um zu verfolgen, welchen neuen Code meine Schüler ihrem Home-Verzeichnis hinzufügen, indem sie "git diff" auf meinen lokalen Kopien ihrer Programme verwenden. Code, den ich noch nicht genehmigt habe, sollte nicht festgeschrieben werden, sondern weiterhin als neu hinzugefügte Zeilen angezeigt werden (im Vergleich zu einer leeren Datei), solange er nicht festgeschrieben (d. H. Genehmigt) wird. – EOL

+0

@EOL: Sie könnten auch einfach automatisieren berühren, hinzufügen, * dann * kopieren. – Cascabel

+0

@EOL: Tut mir leid, dass ich unfreundlich geklungen habe - ich wollte nur darauf hinweisen, dass ich nicht empfehle, das zu tun, was ich in dieser Antwort erklärt habe. Ich denke, die Ansätze, die Jefromi in den Kommentaren zu Ihrer Frage vorschlägt, bieten flexiblere (und zuverlässigere) Arbeitsabläufe. –

Verwandte Themen