10 Stimmen

Git ignoriert das Muster .gitattributes

Ich habe eine Verzeichnisstruktur wie diese:

root/
  .git
  deploy/
  Site/
    blah/
    more_blah/
      something.local
      else.development
    Rakefile
    .gitattributes

Bearbeitung: Zur weiteren Klärung haben Verzeichnisse ein abschließendes / und Kinder werden unter einem Verzeichnis eingerückt, also sind blah und more_blah Verzeichnisse, aber Rakefile und .gitattributes sind Dateien, aber alle vier sind Kinder von Site.


Ich führe git-archive vom Verzeichnis Site aus aus

git archive --format=tar --prefix=git-v0.0.1/ v0.0.1 | gzip > ../deploy/git-v0.0.1.tar.zip

aber egal welches Muster ich in .gitattributes setze, das resultierende Archiv enthält immer Rakefile. Ich habe versucht:

  • Rakefile
  • Site/Rakefile
  • */Rakefile
  • ./Rakefile
  • Rakefile*
  • *

Keines davon funktioniert wie erwartet. Ist jemand bereit, mir die offensichtliche, aber nicht offensichtliche Lösung zu zeigen? Jede Hilfe ist sehr geschätzt.


Entschuldigung, dass ich nicht klar war.

  • Ich sagte, dass das von mir verwendete Muster nicht zu funktionieren scheint, aber ich verwende "export-ignore" nach dem Muster.
  • Rakefile ist kein Verzeichnis, sondern nur eine Datei
  • Die .gitattributes-Datei ist erfolgreich dabei, andere Muster aus dem Archiv zu entfernen, Rakefile ist nicht das einzige verwendete Muster, funktioniert aber nicht. Es funktioniert nicht, egal ob ich es alleine oder mit anderen Mustern verwende, und an jeder Stelle in der Datei. Das ist nicht wahr, aufgrund der Umbenennung bestimmter Dateien, aber das Commit mit der Umbenennung nicht zu archivieren, schien ich einige gute Ergebnisse zu bekommen. Mein Fehler! :S

Dies ist meine .gitattributes (befindet sich im Verzeichnis Site)

Rakefile        export-ignore
*.local         export-ignore
*.development   export-ignore
*.staging       export-ignore

6voto

Alexander Pravdin Punkte 4018

Nicht sicher, ob dies ein häufiger Fall ist, aber ich hatte Schwierigkeiten, den Ordner tests vom Quellcodebaum auszuschließen, der viele verschachtelte Ebenen von Ordnern hat. Wenn ich nur diese Zeile in die .gitattributes geschrieben habe

tests/* export-ignore

hat es nicht funktioniert und das gesamte Verzeichnis blieb im Archiv erhalten. Die Lösung bestand darin, Platzhalterzeichen für alle Unterverzeichnisebenen hinzuzufügen:

tests/* export-ignore
tests/*/* export-ignore
tests/*/*/* export-ignore
tests/*/*/*/* export-ignore
tests/*/*/*/*/* export-ignore

Mit diesen Zeilen verschwand das Verzeichnis tests endlich aus dem Archiv.

5voto

ian Punkte 11473

Ich glaube, dass @Jefromi die benötigten Informationen gegeben hat, um dies mit seinen Kommentaren zu lösen, aber zu bescheiden ist, um den Verdienst dafür zu übernehmen, und ich möchte meine Akzeptanzquote bei 100% halten (zu Recht), also gebe ich die Antwort hier:


Erste Bearbeitung:

Ok, zwei Dinge waren erforderlich. --worktree-attributes allein hat nicht funktioniert, aber als ich die Datei .gitattributes vom Site-Verzeichnis ins Stammverzeichnis verschoben habe, hat es funktioniert. Noch einmal, das Git-Buch gibt an, dass die Datei nicht im Stammverzeichnis sein muss, damit es funktioniert (Hinweis: ungültiger Link)

... (normalerweise das Stammverzeichnis Ihres Projekts)


Viel späterer Bearbeitung:

Selbst in der neuesten Version der Dokumentation (2.35.1) gibt es Verweise auf .gitattributes-Dateien, die nicht im Stammverzeichnis des Repositorys liegen (GIT_WORK_TREE / GIT_DIR) z.B.

nicht in .gitattributes-Dateien in Arbeitsbaum-Unterverzeichnissen

Git folgt nicht symbolischen Verknüpfungen, wenn es auf eine .gitattributes-Datei im Arbeitsbaum zugreift.


Ich fühle mich von diesen Dokumenten ein wenig im Stich gelassen (für einmal). Ich denke auch, dass es ein Verhalten ist, das nicht dem entspricht, was man denken würde, die Datei optisch einzubeziehen, wenn .gitignore einfach funktioniert, meiner Meinung nach.

4voto

VonC Punkte 1117238

Hinweis: Um ein Verzeichnis zu ignorieren, muss ein '/' am Ende dieses Verzeichnisses stehen.

Rakefile/

Für das Archiv, wie Arrowmaster in seiner Antwort erwähnt, und wie das Pro Git-Buch näher erläutert, benötigen Sie die Option export-ignore:

Rakefile/ export-ignore

3voto

JerodG Punkte 1061

Wenn Sie möchten, dass Git eine Datei ignoriert, fügen Sie sie in die .gitignore-Datei, nicht in die .attributes-Datei.

Wenn Sie Ihre Rakefile ignorieren möchten, fügen Sie folgendes in die .gitignore-Datei im Stammverzeichnis Ihres Projekts ein.

/**/Rakefile

Geben Sie den vollständigen Pfad an, wenn Sie mehr als eine Datei haben und nur eine davon ignorieren möchten.

Ein paar Beispiele, wie Sie Musterabgleich für diese Dateien implementieren können:

Für alle Dateien in allen Ordnern

/**/*.ext

Für eine Datei in allen Ordnern

/**/some_file.ext

Datei im Stammverzeichnis

/some_file.ext

Datei in einem Ordner

/some_folder/some_file.ext

Alle Dateien in einem Ordner

/some_folder/*

2voto

Holger Böhnke Punkte 742

Mit Git-Version 1.7.2.5, die in Debian Squeeze standardmäßig verwendet wird (daher dieser Beitrag), darf keine Schrägstrich am Ende stehen, um ein Verzeichnis zu ignorieren. Um also das deploy-Verzeichnis in der obigen Frage zu ignorieren, muss die folgende Zeile verwendet werden (ohne Schrägstrich):

deploy        export-ignore

Dies steht im Widerspruch zur Dokumentation (man gitattributes / man gitignore) und dem Git-Buch. Die Dokumentation von gitattributes verweist auf gitignore. Interessanterweise funktionieren Verzeichnisse mit einem Schrägstrich (deploy/) in einer .gitignore-Datei.

Ich habe spätere Versionen von Git nicht getestet.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X