Bagaimana cara saya mengabaikan file dalam direktori di Git?

544

Apa sintaks yang tepat untuk .gitignore file untuk mengabaikan file dalam direktori?

Apakah itu akan terjadi?

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

atau

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

?

Chris McKnight
sumber
5
apakah .gitignoremembedakan antara file dan direktori yang diabaikannya? misalnya, apakah datavs data/bermakna berbeda?
Charlie Parker
6
@CharlieParker yes-ish: dataakan mengabaikan file dan direktori yang cocok, data/hanya akan mengabaikan direktori yang cocok.
Bersenang-senang
Selalu ingat jika Anda telah melakukan atau melakukan file yang Anda coba abaikan, maka tidak ada cara untuk mengabaikannya :( Hanya 2 sen saya setelah berpikir saya salah pola dan membuang seperempat jam.
Adam
@Adam benar Anda harus memperbarui .gitignore lalu unstage / git rm --cached file tersebut.
Chris McKnight

Jawaban:

374

FORMAT POLA

  • Baris kosong tidak cocok dengan file, sehingga dapat berfungsi sebagai pemisah untuk dibaca.

  • Baris yang dimulai dengan #berfungsi sebagai komentar.

  • Awalan opsional !yang meniadakan pola; setiap file yang cocok dikecualikan oleh pola sebelumnya akan dimasukkan lagi. Jika pola yang dinegasikan cocok, ini akan menimpa sumber pola prioritas yang lebih rendah.

  • Jika pola diakhiri dengan garis miring, ia dihapus untuk tujuan uraian berikut, tetapi hanya akan menemukan kecocokan dengan direktori. Dengan kata lain, foo/akan cocok dengan direktori foodan jalur di bawahnya, tetapi tidak akan cocok dengan file biasa atau tautan simbolik foo(ini konsisten dengan cara bagaimana pathspec bekerja secara umum di git).

  • Jika polanya tidak mengandung slash /, git memperlakukannya sebagai pola shell glob dan memeriksa kecocokan dengan pathname relatif terhadap lokasi .gitignorefile (relatif terhadap level tertinggi pohon kerja jika bukan dari .gitignorefile).

  • Jika tidak, git memperlakukan polanya sebagai gumpalan shell yang cocok untuk dikonsumsi dengan fnmatch(3)dengan FNM_PATHNAMEflag: wildcard dalam polanya tidak akan cocok dengan /dalam pathname. Misalnya, Documentation/*.htmlcocok Documentation/git.htmltetapi tidak Documentation/ppc/ppc.htmlatau tools/perf/Documentation/perf.html.

  • Garis miring terkemuka cocok dengan awal pathname. Misalnya, /*.ccocok cat-file.ctetapi tidak mozilla-sha1/sha1.c.

Anda dapat menemukan lebih banyak di sini

git help gitignore
atau
man gitignore

Op De Cirkel
sumber
2
Bagaimana saya bisa meletakkan file .gitignore di tingkat atas dan membuatnya berfungsi untuk folder di bawahnya? Terima kasih.
Royi
104
-1 TL; DR dan hampir tidak menjawab pertanyaan. Ini tentang direktori, bukan file, jadi bagian tebal hanya sesuai dengan beberapa senam mental. @ Jeffromi lebih langsung.
Bob Stein
Saya telah membaca orang itu, dan jawaban @ Jefromi lebih baik - selama Anda juga membaca peringatan @ jox juga - dan @ Luke Hutton mungkin lebih berguna untuk mengabaikan misalnya file proyek IDE.
WillC
1
Ini sebenarnya adalah copy-paste dari dokumentasi git
mcont
1
Tidak yakin (pada dasarnya) menyalin-menempelkan manhalaman atau dokumen resmi adalah format terbaik untuk SO ...
jdk1.0
183

Itu akan menjadi yang pertama. Pergi dengan ekstensi juga alih-alih struktur folder.

Misalnya saya mengabaikan file pengembangan C #:

#OS junk files
[Tt]humbs.db
*.DS_Store

#Visual Studio files
*.[Oo]bj
*.user
*.aps
*.pch
*.vspscc
*.vssscc
*_i.c
*_p.c
*.ncb
*.suo
*.tlb
*.tlh
*.bak
*.[Cc]ache
*.ilk
*.log
*.lib
*.sbr
*.sdf
ipch/
obj/
[Bb]in
[Dd]ebug*/
[Rr]elease*/
Ankh.NoLoad

#Tooling
_ReSharper*/
*.resharper
[Tt]est[Rr]esult*

#Project files
[Bb]uild/

#Subversion files
.svn

# Office Temp Files
~$*

Memperbarui

Saya pikir saya akan memberikan pembaruan dari komentar di bawah ini. Meskipun tidak secara langsung menjawab pertanyaan OP, lihat yang berikut untuk contoh lebih lanjut.gitignore sintaks.

Wiki komunitas (terus diperbarui):

.gitignore untuk Proyek dan Solusi Visual Studio

Lebih banyak contoh dengan penggunaan bahasa tertentu dapat ditemukan di sini (terima kasih atas komentar Chris McKnight):

https://github.com/github/gitignore

Luke Hutton
sumber
5
@Stallman, itu dia range. Jadi cocok *.Objjuga *.obj.
norbert
131

Jalur yang berisi garis miring dianggap relatif terhadap direktori yang berisi file .gitignore - biasanya tingkat teratas dari repositori Anda, meskipun Anda juga dapat menempatkannya di subdirektori.

Jadi, karena dalam semua contoh yang Anda berikan, path berisi garis miring, kedua versi itu identik. Satu-satunya waktu yang Anda butuhkan untuk membuat garis miring adalah ketika tidak ada yang berada di jalurnya. Misalnya, untuk mengabaikan foo hanya di tingkat atas repositori, gunakan /foo. Cukup menulisfoo akan mengabaikan apa pun yang disebut foo di mana saja di repositori.

Kartu liar Anda juga berlebihan. Jika Anda ingin mengabaikan seluruh direktori, cukup beri nama:

lib/model/om

Satu-satunya alasan untuk menggunakan wildcard seperti yang Anda miliki adalah jika Anda berniat untuk kemudian mengabaikan sesuatu di direktori:

lib/model/om/*      # ignore everything in the directory
!lib/model/om/foo   # except foo
Cascabel
sumber
5
Penjelasan yang lebih baik daripada jawaban yang diterima untuk pertanyaan ini
eerrzz
78

Sebuah slash terkemuka menunjukkan bahwa entri abaikan hanya valid terkait dengan direktori tempat file .gitignore berada. Menentukan *.oakan mengabaikan semua file .o di direktori ini dan semua subdirs, sementara /*.ohanya mengabaikannya dalam direktori itu, sementara lagi, /foo/*.ohanya akan mengabaikannya di /foo/*.o.

jørgensen
sumber
34

Jika Anda ingin meletakkan file .gitignore di tingkat atas dan membuatnya berfungsi untuk folder apa pun di bawahnya gunakan /**/ .

Misalnya untuk mengabaikan semua *.mapfile dalam /src/main/folder dan sub-folder gunakan:

/src/main/**/*.map
petrsyn
sumber
Saya perlu melakukan ini. Tidak yakin mengapa Anda perlu dua ** . Satu sudah cukup untukku.
Novocaine
8
** Cocok juga file dalam subdirektori
petrsyn
Terima kasih atas info @petrsyn
Novocaine
30

Kedua contoh dalam pertanyaan tersebut adalah contoh yang sangat buruk yang dapat menyebabkan hilangnya data!

Saran saya: jangan pernah menambahkan /*direktori ke file .gitignore, kecuali Anda punya alasan bagus!

Alasan yang bagus adalah misalnya apa yang ditulis Jefromi: "jika Anda berniat untuk kemudian mengabaikan sesuatu di direktori" .

Alasan mengapa itu seharusnya tidak dilakukan adalah penambahan itu /* direktori pada satu sisi berfungsi dengan cara yang mengabaikan semua isi direktori dengan benar, tetapi di sisi lain itu memiliki efek samping yang berbahaya:

Jika Anda mengeksekusi git stash -u(untuk sementara menyimpan file yang dilacak dan tidak dilacak) atau git clean -df(untuk menghapus file yang tidak terlacak tetapi tetap diabaikan) di repositori Anda, semua direktori yang diabaikan dengan yang ditambahkan /*akan dihapus secara permanen !

Beberapa latar belakang

Saya harus belajar ini dengan cara yang sulit. Seseorang di tim saya menambahkan /*ke beberapa direktori di .gitignore kami. Seiring waktu saya memiliki kesempatan di mana direktori tertentu akan tiba-tiba menghilang. Direktori dengan gigabytes data lokal yang dibutuhkan oleh aplikasi kita. Tidak ada yang bisa menjelaskannya dan saya selalu ingin mengunduh ulang semua data. Setelah beberapa saat saya mendapat gagasan bahwa itu mungkin ada hubungannya dengan git stash. Suatu hari saya ingin membersihkan repo lokal saya (sambil menyimpan file yang diabaikan) dan saya menggunakan git clean -dfdan lagi data saya hilang. Kali ini saya sudah cukup dan menyelidiki masalah ini. Saya akhirnya tahu bahwa alasannya adalah ditambahkan /*.

Saya berasumsi itu bisa dijelaskan entah bagaimana oleh fakta yang directory/*mengabaikan semua isi direktori tetapi bukan direktori itu sendiri. Karena itu tidak dianggap dilacak atau diabaikan ketika hal-hal dihapus. Meski begitu git statusdan git status --ignoredmemberikan gambaran yang sedikit berbeda di atasnya.

Bagaimana cara mereproduksi

Inilah cara mereproduksi perilaku. Saat ini saya menggunakan Git 2.8.4.

Direktori yang disebut localdata/dengan file dummy di dalamnya ( important.dat) akan dibuat di repositori git lokal dan isinya akan diabaikan dengan memasukkan /localdata/*ke dalam .gitignorefile tersebut. Ketika salah satu dari dua perintah git yang disebutkan dijalankan sekarang, direktori tersebut akan (secara tak terduga) hilang.

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

Jika Anda melakukannya di git status --ignoredsini, Anda akan mendapatkan:

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/

Sekarang lakukan

git stash -u
git stash pop

atau

git clean -df

Dalam kedua kasus direktori yang diduga diabaikan localdataakan hilang!

Tidak yakin apakah ini dapat dianggap bug, tapi saya kira itu setidaknya fitur yang tidak diperlukan siapa pun.

Saya akan melaporkannya ke daftar pengembangan git dan melihat apa yang mereka pikirkan tentang itu.

cemas
sumber
15

Itu akan:

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

atau bahkan mungkin:

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

dalam kasus itu filterdan formsatu-satunya direktori di lib yang memiliki basesubdirektori yang perlu diabaikan (lihat sebagai contoh apa yang dapat Anda lakukan dengan asterik).

aefxx
sumber
14

Yang pertama. Jalur file tersebut relatif dari tempat file .gitignore Anda berada.

Unixmonkey
sumber
2
Ini hanya berlaku untuk pola yang mengandung garis miring. Nama direktori tunggal seperti "mydir" juga akan mengabaikan direktori (dan file) yang terletak di subfolder pada kedalaman apa pun. Hanya dengan meletakkan garis miring di depan akan membuatnya relatif dari tempat file .gitignore Anda berada.
Jox
4

Saya memelihara layanan berbasis GUI dan CLI yang memungkinkan Anda membuat .gitignoretemplate dengan sangat mudah di https://www.gitignore.io .

Anda dapat mengetik template yang Anda inginkan di bidang pencarian atau menginstal alias baris perintah dan menjalankan

$ gi swift,osx

Joe
sumber
0

Contoh file .gitignore dapat terlihat seperti di bawah ini untuk proyek Android Studio

# 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
Shirish Herwade
sumber