2622 Stimmen

.gitignore ignoriert alles außer ein paar Dateien

Ich weiß, dass eine .gitignore-Datei bestimmte Dateien vor der Git-Version verbirgt Kontrolle. Ich habe ein Projekt (LaTeX), das viele zusätzliche Dateien erzeugt (.auth, .dvi, .pdf, Protokolle usw.) erzeugt, aber ich möchte nicht, dass diese nachverfolgt werden.

Ich bin mir bewusst, dass ich dafür sorgen könnte (oder sollte), dass all diese Dateien in einer separaten Unterordner im Projekt ablegen könnte, da ich den Ordner dann einfach ignorieren könnte.

Gibt es jedoch eine praktikable Möglichkeit, die Ausgabedateien in der Wurzel des Projektbaums zu halten und .gitignore zu verwenden, um alles zu ignorieren, außer den Dateien mit Git verfolge? Etwas wie

# Ignore everything
*

# But not these files...
script.pl
template.latex
# etc...

20 Stimmen

Duplikat von stackoverflow.com/q/9162919/321973 (Ich weiß, dass das neuer ist, aber die Antwort dort ist richtiger). Eigentlich diese Antwort ist wahrscheinlich die beste

5voto

raftaar1191 Punkte 363

Ich habe dies zum Laufen gebracht

# Vendor
/vendor/braintree/braintree_php/*
!/vendor/braintree/braintree_php/lib

4voto

Armin Punkte 14621

Ich hatte auch einige Probleme mit der Negierung einzelner Dateien. Ich konnte sie zwar festschreiben, aber meine IDE (IntelliJ) beschwerte sich immer über ignorierte Dateien, die nachverfolgt werden.

git ls-files -i --exclude-from .gitignore

Es werden die beiden Dateien angezeigt, die ich auf diese Weise ausgeschlossen habe:

public/
!public/typo3conf/LocalConfiguration.php
!public/typo3conf/PackageStates.php

Letztendlich hat das für mich funktioniert:

public/*
!public/typo3conf/
public/typo3conf/*
!public/typo3conf/LocalConfiguration.php
!public/typo3conf/PackageStates.php

Der Schlüssel war die Negation des Ordners typo3conf/ Erstens.

Außerdem scheint es, dass die Reihenfolge der Aussagen spielt keine Rolle . Stattdessen müssen Sie erst alle Unterordner explizit negieren, bevor Sie einzelne Dateien darin negieren können.

Der Ordner !public/typo3conf/ und den Inhalt des Ordners public/typo3conf/* sind zwei verschiedene Dinge für .gitignore.

Tolles Thema! Dieses Thema hat mich schon eine Weile beschäftigt ;)

4voto

Manish Bansal Punkte 185

Bei mir hat bisher nichts funktioniert, weil ich versucht habe, ein Glas aus der Bibliothek hinzuzufügen.

Das hat nicht funktioniert:

build/*
!build/libs/*
!build/libs/
!build/libs/myjarfile.jar 

Das hat funktioniert:

build/*
!build/libs

3voto

Didier A. Punkte 4211

Ich scheine etwas gefunden zu haben, das bei mir funktioniert hat und das niemand sonst erwähnt hat.

# Ignore everything
*

# But not these files...
!.gitignore
!script.pl
!template.latex
# etc...

# And if you want to include a sub-directory and all sub-directory and files under it, but not all sub-directories
!subdir/
!subdir/**/*

Um zu verhindern, dass ein Unterverzeichnis ignoriert wird, müssen Sie zwei Einträge haben, einen für das Unterverzeichnis selbst !subdir/ und dann eine weitere, die sich auf alle darunter liegenden Dateien und Ordner ausdehnt !subdir/**/*

3voto

not2qubit Punkte 11725

Es ist eine Katastrophe, dass nach 16 Jahren (2005) der Verwendung von git gibt es keinen einfachen und offensichtlichen Weg, um ausschließen eine Datei, wenn sie sich tief in einer Verzeichnishierarchie befindet, die ansonsten ignoriert werden sollte. Stattdessen müssen wir auf verrückte Dinge wie das wiederholte Durchforsten der Struktur und das Ausschließen und Einfügen von Verzeichnissen in der richtigen Reihenfolge zurückgreifen. Etwas, das man sich unmöglich merken kann, wenn man es 4 Mal im Jahr machen muss.

Die einzige intelligente, aber sehr merkwürdige Alternative ist die Verwendung der git add --force . Etwas, das zwangsläufig irgendwann scheitern muss, wenn man nicht nur mit dem Gitted Repo arbeitet.

Deshalb habe ich eine kleine Bash-Funktion geschrieben, um dies für Sie zu beheben, für einfaches Kopieren und Einfügen. Lassen Sie mich zuerst den Einzeiler erklären:

f=0; y='';for x in $(echo "uploads/rubbish/stuff/KEEP_ME/a.py" | tr '\/' '\n'); do y="$y/$x"; if [ $(($f)) -eq 0 ]; then y="$x"; f=1; fi; echo -e '!'"$y/\n$y/*"; done | sed '$d' |sed -z 's/..$//'; echo;

# output:
!uploads/
uploads/*
!uploads/rubbish/
uploads/rubbish/*
!uploads/rubbish/stuff/
uploads/rubbish/stuff/*
!uploads/rubbish/stuff/KEEP_ME/
uploads/rubbish/stuff/KEEP_ME/*
!uploads/rubbish/stuff/KEEP_ME/a.py

Beschreibung

  • Es gibt eine if Anweisung, um zu korrigieren, dass der 1. Punkt keine / .
  • tr '\/' '\n' - übersetzen die / a \n in Standard-POSIX-Pfaden (um eine Liste zu erhalten)
  • y="$y/$x" - das nächste hinzufügen Unterverzeichnis (in der Liste) nach dem vorherigen Verzeichnis .
  • echo -e '!'"$y/\n$y/*" -
    die 2 Zeilen des Unterverzeichnisses item drucken, die erste mit ! Präfix und 2. mit /* Postfix .
  • sed '$d' - letzte Zeile entfernen
  • sed -z 's/..$//' - die letzten 2 Zeichen entfernen /* ab letzter Zeile

Dann erstellen wir die Funktion:

function gitkeep () { f=0; y='';for x in $(echo "$1" | tr '\/' '\n'); do y="$y/$x"; if [[ f -eq 0 ]]; then y="$x"; f=1; fi; echo -e '!'"$y/\n$y/*"; done | sed '$d' |sed -z 's/..$//'; echo; }

# gitkeep "uploads/rubbish/stuff/KEEP_ME/a"

!uploads/
uploads/*
!uploads/rubbish/
uploads/rubbish/*
!uploads/rubbish/stuff/
uploads/rubbish/stuff/*
!uploads/rubbish/stuff/KEEP_ME/
uploads/rubbish/stuff/KEEP_ME/*
!uploads/rubbish/stuff/KEEP_ME/a

Hier habe ich die Arithmetik vereinfacht if Anweisung an if [[ f -eq 0 ]]; .

Viel Spaß!

1 Stimmen

Das ist sehr vielversprechend, und danke für die Mitteilung. Ich muss darauf hinweisen, dass die Antwort ici ermöglicht die Angabe mehrerer Ordner: z.B. KEEP_ME1/ y KEEP_ME2/ ohne Wiederholung der Zeilen, die diesen Unterordnern gemeinsam sein können, da sie denselben übergeordneten Ordner nutzen. Ich vermute, dass man bei dem von Ihnen vorgeschlagenen Ansatz jeden Ordner einzeln auflisten müsste KEEP_ME1/ y KEEP_ME2/

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