569 Stimmen

Wie kann ich Dateien in einem Verzeichnis in Git ignorieren?

Wie lautet die korrekte Syntax für die .gitignore Datei, um Dateien in einem Verzeichnis zu ignorieren?

Wäre es

config/databases.yml
cache/*
log/*
data/sql/*
lib/filter/base/*
lib/form/base/*
lib/model/map/*
lib/model/om/*

o

/config/databases.yml
/cache/*
/log/*
/data/sql/*
/lib/filter/base/*
/lib/form/base/*
/lib/model/map/*
/lib/model/om/*

?

32voto

jox Punkte 1983

Beide Beispiele in der Frage sind eigentlich sehr schlechte Beispiele, die zu Datenverlust führen können!

*Mein Rat: Niemals anhängen `/` zu Verzeichnissen in .gitignore-Dateien, es sei denn, Sie haben einen guten Grund!**

Ein guter Grund wäre zum Beispiel das, was Jefromi geschrieben hat: "wenn Sie beabsichtigen, etwas im Verzeichnis nachträglich zu ent-ignorieren" .

Der Grund, warum es sonst nicht gemacht werden sollte, ist, dass das Anhängen von /* auf Verzeichnisse funktioniert zwar einerseits so, dass es alle Inhalte des Verzeichnisses ordentlich ignoriert, hat aber andererseits einen gefährlichen Nebeneffekt:

Wenn Sie Folgendes ausführen git stash -u (um verfolgte und nicht verfolgte Dateien vorübergehend zu speichern) oder git clean -df (um nicht verfolgte, aber ignorierte Dateien zu löschen) in Ihrem Projektarchiv, alle Verzeichnisse, die ignoriert werden, mit einem angehängten /* wird unwiderruflich gelöscht !

Einige Hintergrundinformationen

Das musste ich auf die harte Tour lernen. Jemand in meinem Team fügte /* zu einigen Verzeichnissen in unserer .gitignore. Im Laufe der Zeit kam es vor, dass bestimmte Verzeichnisse plötzlich verschwanden. Verzeichnisse mit Gigabytes an lokalen Daten, die von unserer Anwendung benötigt werden. Niemand konnte sich das erklären und ich musste immer alle Daten neu herunterladen. Nach einer Weile kam ich auf die Idee, dass es mit folgenden Dingen zu tun haben könnte git stash . Eines Tages wollte ich mein lokales Projektarchiv bereinigen (wobei ich ignorierte Dateien beibehielt) und ich verwendete git clean -df und wieder waren meine Daten weg. Diesmal hatte ich genug und untersuchte das Problem. Schließlich fand ich heraus, dass der Grund die angehängten /* .

Ich gehe davon aus, dass sich das irgendwie dadurch erklären lässt, dass directory/* ignoriert zwar alle Inhalte des Verzeichnisses, nicht aber das Verzeichnis selbst. Daher wird es weder als verfolgt noch ignoriert, wenn Dinge gelöscht werden. Auch wenn git status y git status --ignored geben ein etwas anderes Bild davon.

Wie man sich vervielfältigt

So lässt sich das Verhalten reproduzieren. Ich verwende derzeit Git 2.8.4.

Ein Verzeichnis namens localdata/ mit einer Dummy-Datei darin ( important.dat ) wird in einem lokalen Git-Repository erstellt, und der Inhalt wird ignoriert, indem man /localdata/* in die .gitignore Datei. Wenn nun einer der beiden genannten Git-Befehle ausgeführt wird, geht das Verzeichnis (unerwartet) verloren.

mkdir test
cd test
git init
echo "/localdata/*" >.gitignore
git add .gitignore
git commit -m "Add .gitignore."
mkdir localdata
echo "Important data" >localdata/important.dat
touch untracked-file

Wenn Sie eine git status --ignored hier erhalten Sie:

On branch master
Untracked files:
  (use "git add <file>..." to include in what will be committed)

  untracked-file

Ignored files:
  (use "git add -f <file>..." to include in what will be committed)

  localdata/

Tun Sie nun entweder

git stash -u
git stash pop

o

git clean -df

In beiden Fällen wurde das angeblich ignorierte Verzeichnis localdata wird weg sein!

Ich bin mir nicht sicher, ob dies als Fehler angesehen werden kann, aber ich denke, es ist zumindest eine Funktion, die niemand braucht.

Ich werde das an die Git-Entwicklungsliste weiterleiten und sehen, was sie darüber denken.

16voto

aefxx Punkte 23877

Das wäre es:

config/databases.yml
cache
log
data/sql
lib/filter/base
lib/form/base
lib/model/map
lib/model/om

oder möglicherweise sogar:

config/databases.yml
cache
log
data/sql
lib/*/base
lib/model/map
lib/model/om

für den Fall, dass filter y form sind die einzigen Verzeichnisse in lib, die ein base Unterverzeichnis, das ignoriert werden muss (dies ist ein Beispiel dafür, was man mit den Sternchen machen kann).

15voto

Unixmonkey Punkte 18072

Die erste. Diese Dateipfade sind relativ zum Speicherort Ihrer .gitignore-Datei.

4voto

Joe Punkte 1290

Ich verwalte einen GUI- und CLI-basierten Dienst, mit dem Sie Folgendes generieren können .gitignore Vorlagen ganz einfach unter https://www.gitignore.io .

Sie können entweder die gewünschten Vorlagen in das Suchfeld eingeben oder den Befehlszeilen-Alias installieren und Folgendes ausführen

$ gi swift,osx

0voto

Shirish Herwade Punkte 11181

Eine Probe .gitignore Datei kann für ein Android Studio Projekt wie folgt aussehen

# built application files
*.apk
*.ap_

# files for the dex VM
*.dex

# Java class files
*.class

# generated files
bin/
gen/

# Local configuration file (sdk path, etc)
local.properties

#Eclipse
*.pydevproject
.project
.metadata
bin/**
tmp/**
tmp/**/*
*.tmp
*.bak
*.swp
*~.nib
local.properties
.classpath
.settings/
.loadpath
YourProjetcName/.gradle/
YourProjetcName/app/build/
*/YourProjetcName/.gradle/
*/YourProjetcName/app/build/

# External tool builders
.externalToolBuilders/

# Locally stored "Eclipse launch configurations"
*.launch

# CDT-specific
.cproject

# PDT-specific
.buildpath

# Proguard folder generated by Eclipse
proguard/

# Intellij project files
*.iml
*.ipr
*.iws
.idea/
/build
build/
*/build/
*/*/build/
*/*/*/build/
*.bin
*.lock
YourProjetcName/app/build/
.gradle
/local.properties
/.idea/workspace.xml
/.idea/libraries
.DS_Store
.gradle/
app/build/
*app/build/

# Local configuration file (sdk path, etc)
local.properties
/YourProjetcName/build/intermediates/lint-cache/api-versions-6-23.1.bin
appcompat_v7_23_1_1.xml
projectFilesBackup
build.gradle
YourProjetcName.iml
YourProjetcName.iml
gradlew
gradlew.bat
local.properties
settings.gradle
.gradle
.idea
android
build
gradle

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