Buat .gitignore abaikan semuanya kecuali beberapa file


1701

Saya mengerti bahwa file .gitignore menyelubungi file yang ditentukan dari kontrol versi Git. Saya memiliki proyek (LaTeX) yang menghasilkan banyak file tambahan (.auth, .dvi, .pdf, log, dll) saat dijalankan, tetapi saya tidak ingin mereka dilacak.

Saya sadar bahwa saya dapat (mungkin harus) membuatnya sehingga semua file tersebut diletakkan di subfolder terpisah dalam proyek, karena saya kemudian bisa mengabaikan folder tersebut.

Namun, apakah ada cara yang layak untuk menyimpan file output di root dari pohon proyek dan menggunakan .gitignore untuk mengabaikan segalanya kecuali file yang saya lacak dengan Git? Sesuatu seperti

# Ignore everything
*

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

12
Duplikat dari stackoverflow.com/q/9162919/321973 (saya tahu itu lebih baru, tetapi jawabannya ada lebih benar). Sebenarnya jawaban ini mungkin yang terbaik
Tobias Kienzler

Jawaban:


2442

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.

# Ignore everything
*

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

# ...even if they are in subdirectories
!*/

# if the files to be tracked are in subdirectories
!*/a/b/file1.txt
!*/a/b/c/*

14
Sepertinya ini juga 'mengabaikan' subfolder, sehingga setiap file bernama 'script.pl' dalam apa pun selain dir root tidak akan ditemukan. Saya menggunakan ini sekarang (dengan * .pl) dan semua file * .pl diabaikan meskipun ada banyak subdirektori di bawah file .gitignore
PandaWood

38
@ PandaWood Masalah itu diangkat di sini (stackoverflow.com). Ini disebabkan oleh ekspresi pertama yang cocok dengan semua termasuk direktori, yang tidak pernah Anda abaikan. Untuk memperbaikinya, tambahkan (! * /), Yang cocok dengan subdirektori apa pun (secara rekursif) di direktori saat ini. Ini tidak akan membantu jawaban orang tua, yang mana memasukkan file tertentu ke daftar putih (jika berada di subdirektori, Anda mungkin ingin menentukan path lengkap secara manual, atau menggunakan file .gitignore khusus direktori).
simont

40
Saya tidak bisa melakukan ini. Saya mengabaikan folder (mis. wp/) Tetapi saya ingin TIDAK mengabaikan beberapa file jauh di folder itu (mis wp/path/to/some/location/*.). Satu-satunya cara saya bisa membuatnya bekerja adalah dengan melakukangit add -f wp/path/to/some/location/*
trusktr

13
@trusktr Gunakan !*/pengecualian simont
Tobias Kienzler

7
Ya ampun aturan terakhir: !*/membuat semua perbedaan dalam upaya sia-sia saya untuk bertengkar .gitignorefile untuk bekerja. Terima kasih banyak.
racl101

628

Jika Anda ingin mengabaikan seluruh konten direktori kecuali satu file di dalamnya, Anda bisa menulis sepasang aturan untuk setiap direktori di path file. Misalnya .gitignore untuk mengabaikan folder pippo kecuali dari pippo / pluto / paperino.xml

.gitignore

pippo/*
!pippo/pluto
pippo/pluto/*
!pippo/pluto/paperino.xml

58
Jawaban yang sangat baik, tapi itu yang perlu dicatat bagi siapa saja yang datang di ini kemudian bahwa foodan foo/*yang tidak sama. Agar ini berfungsi, Anda harus menggunakan foo/*untuk folder dasar
thislooksfun

20
@ Mayank Pippo Goofy dalam bahasa Italia sedangkan Paperino adalah Donald Duck dan Pluto sama dengan dalam bahasa Inggris. Mereka dulunya adalah triplet yang sangat umum dari nama variabel untuk sampel pemrograman pada masa itu. Sangat menyenangkan untuk membacanya lagi .. :)
Ghidello

Apa yang dikatakan @thislooksfun penting jika Anda ingin "mengecualikan folder kecuali file x".
Czechnology

8
tidak berfungsi untuk saya: node_modules / *! node_modules / bootstrap
SuperUberDuper

1
@simple_human Itu akan benar jika ia mengabaikan semua yang ada di root repositori, atau jika ia memiliki file .gitignore yang perlu diperhatikan, di dalam direktori yang disebutkan.
xZero

245

Anda ingin menggunakan, /*bukan *atau*/ dalam banyak kasus

Penggunaannya *valid, tetapi bekerja secara rekursif. Itu tidak akan melihat direktori sejak saat itu. Orang merekomendasikan !*/untuk menggunakan direktori whitelist lagi, tetapi sebenarnya lebih baik memasukkan daftar hitam ke folder tingkat tertinggi/*

# Blacklist files/folders in same directory as the .gitignore file
/*

# Whitelist some files
!.gitignore
!README.md

# Ignore all files named .DS_Store or ending with .log
**/.DS_Store
**.log

# Whitelist folder/a/b1/ and folder/a/b2/
# trailing "/" is optional for folders, may match file though.
# "/" is NOT optional when followed by a *
!folder/
folder/*
!folder/a/
folder/a/*
!folder/a/b1/
!folder/a/b2/
!folder/a/file.txt

# Adding to the above, this also works...
!/folder/a/deeply
/folder/a/deeply/*
!/folder/a/deeply/nested
/folder/a/deeply/nested/*
!/folder/a/deeply/nested/subfolder

Kode di atas akan mengabaikan semua file kecuali untuk .gitignore , README.md, folder/a/file.txt, folder/a/b1/dan folder/a/b2/dan segala sesuatu yang terkandung dalam dua folder lalu. (Dan .DS_Storedan*.log file akan diabaikan di folder itu.)

Jelas saya bisa melakukan eg !/folderatau !/.gitignorejuga.

Info lebih lanjut: http://git-scm.com/docs/gitignore


3
Sangat pintar, terima kasih. IMO, ini adalah cara terbaik untuk melakukannya untuk situs WordPress dengan jumlah minimum aturan penyertaan. Juga, setiap plugin baru, tema atau pembaruan WP tidak dihapus atau ditambahkan tanpa izin tertulis dari Anda. Saat menggunakan GitHub Desktop saya menemukan .DS_Storefile tidak diabaikan, tetapi melalui baris perintah ini bukan masalah. Untuk menyiasati ini, saya harus memindahkan **/.DS_Storesemua aturan di bawah ini.
Jibran

7
Stabilo sintaksis bagian dalam saya memiliki reaksi aneh terhadap judul posting Anda.
itsadok

3
Gracias! Anda juga dapat memasukkan daftar putih file ke folder ..! /some/folder/file.txt
PodTech.io

Luar biasa, menggunakan / * bukannya * memperbaiki semua masalah saya ketika jawaban di atas tidak. Satu-satunya pertanyaan saya sekarang adalah apa perbedaan antara! / Folder dan! / Folder / *? Jika saya menggunakan! / Folder tanpa *, masih mengambil perubahan untuk semua file di folder sejauh yang saya tahu.
Dallin

1
@allin tidak ada perbedaan. Satu daftar putih folder dan daftar putih lain anak-anak folder itu, yang melakukan hal yang sama. Satu-satunya masalah adalah folder atau orang tua file ini harus masuk daftar putih sebelum dapat daftar putih, sehingga Anda tidak dapat melakukan /*itu !/nested/folder/*(atau setara !/nested/folder) tanpa melakukan !/nested/atau !/nestedpertama! (dan mungkin /nested/*di antaranya). Trik yang perlu diingat adalah jika Anda memasukkan subfolder bersarang dalam daftar putih, Anda harus menghitamkan anak-anak di setiap subfolder, dan daftar hitam itu akan berakhir dengan "slash star" ...
Ryan Taylor

75

Sedikit lebih spesifik:

Contoh: Abaikan semuanya webroot/cache- tetapi simpan webroot/cache/.htaccess.

Perhatikan garis miring (/) setelah cachefolder:

GAGAL

webroot/cache*
!webroot/cache/.htaccess

BEKERJA

webroot/cache/*
!webroot/cache/.htaccess

Jika Anda menggunakan Kode VS, berhati-hatilah untuk tidak salah membaca pewarnaan file setelah menerapkan ini ke folder dengan .gitkeep karena nama folder akan berubah hijau tetapi file .gitkeep akan berubah abu-abu seperti semua file yang diabaikan lainnya; .gitkeep akan terlihat seperti diabaikan tetapi Anda akan melihat bahwa ada 'U' di sisi kanan, yang menunjukkan bahwa itu telah terdeteksi
OzzyTheGiant


28

Untuk mengabaikan beberapa file dalam direktori, Anda harus melakukan ini dalam urutan yang benar :

Sebagai contoh, abaikan semua yang ada di folder "aplikasi" kecuali index.php dan folder "config" perhatikan urutannya .

Anda harus meniadakan keinginan yang Anda inginkan terlebih dahulu.

GAGAL

application/*

!application/config/*

!application/index.php

BEKERJA

!application/config/*

!application/index.php

application/*


38
Salah. Anda meniadakan setelah "abaikan segalanya".
Carlos

2
Jangan tertipu git statusuntuk memeriksa apakah perubahan Anda .gitignoreberfungsi seperti yang diharapkan
Philippe Rathé

10
Jika git statustidak mau memberi tahu Anda apa yang dilihatnya dan apa yang diabaikan, lalu bagaimana Anda bisa tahu jika ini berhasil?
Kris

1
@kris Bersihkan cache git terlebih dahulu. Lakukan "git rm --cached *" terlebih dahulu kemudian Anda dapat melakukan "git add --all" kemudian "git status" akan menunjukkan kepada Anda semua perubahan gitignore baru.
Mark McCorkle

20

Anda dapat menggunakan git config status.showUntrackedFiles nodan semua file yang tidak terlacak akan disembunyikan dari Anda. Lihat man git-configdetailnya.


Ini bagus jika Anda hanya ingin mengkomit beberapa file dari banyak!
Josh M.

16

Untuk mengecualikan folder dari .gitignore, berikut ini dapat dilakukan.

!app/

app/*
!app/bower_components/

app/bower_components/*
!app/bower_components/highcharts/

Ini akan mengabaikan semua file / subfolder di dalamnya bower_componentskecuali untuk /highcharts.


14

Ada banyak pertanyaan serupa tentang ini, jadi saya akan memposting apa yang saya tulis sebelumnya:

Satu-satunya cara saya mendapatkan ini untuk bekerja pada mesin saya adalah melakukannya dengan cara ini:

# Ignore all directories, and all sub-directories, and it's contents:
*/*

#Now ignore all files in the current directory 
#(This fails to ignore files without a ".", for example 
#'file.txt' works, but 
#'file' doesn't):
*.*

#Only Include these specific directories and subdirectories and files if you wish:
!wordpress/somefile.jpg
!wordpress/
!wordpress/*/
!wordpress/*/wp-content/
!wordpress/*/wp-content/themes/
!wordpress/*/wp-content/themes/*
!wordpress/*/wp-content/themes/*/*
!wordpress/*/wp-content/themes/*/*/*
!wordpress/*/wp-content/themes/*/*/*/*
!wordpress/*/wp-content/themes/*/*/*/*/*

Perhatikan bagaimana Anda harus secara eksplisit mengizinkan konten untuk setiap level yang ingin Anda sertakan. Jadi jika saya memiliki subdirektori 5 tema yang jauh di bawah, saya masih perlu menjelaskannya.

Ini dari komentar @ Yarin di sini: https://stackoverflow.com/a/5250314/1696153

Ini adalah topik yang bermanfaat:

Saya juga mencoba

*
*/*
**/**

dan **/wp-content/themes/**

atau /wp-content/themes/**/*

Tidak ada yang berhasil untuk saya. Banyak jejak dan kesalahan!


2
Ini adalah satu-satunya metode yang berfungsi untuk secara eksklusif menyertakan ekstensi file tertentu. Bahkan lebih baik, itu membuat seni ASCII yang hebat: gist.github.com/Wolfgange3311999/91c671f5e4d3c56cf5a1
Matthew D. Scholefield

10

Saya punya masalah dengan subfolder.

Tidak bekerja:

/custom/*
!/custom/config/foo.yml.dist

Bekerja:

/custom/config/*
!/custom/config/foo.yml.dist

9

Saya mencoba semua jawaban seperti yang diberikan di sini di atas, tetapi tidak ada yang berhasil untuk saya. Setelah membaca dokumentasi gitignore (di sini ) saya menemukan bahwa jika Anda mengecualikan folder terlebih dahulu, nama file dalam subfolder tidak diindeks. Jadi jika Anda menggunakan tanda seru setelahnya untuk memasukkan file, itu tidak ditemukan dalam indeks dan dengan demikian tidak termasuk dalam klien git Anda.

Itulah cara menemukan solusinya. Saya mulai dengan menambahkan pengecualian untuk semua subfolder di pohon folder saya agar berfungsi, yang merupakan pekerjaan yang sangat berat. Setelah itu saya dapat memadatkan konfigurasi terperinci ke konfigurasi di bawah ini, yang agak bertentangan dengan dokumentasi ..

Bekerja .gitignore:

# Ignore the 'Pro' folder, except for the '3rdparty' subfolder 
/Pro/*
!Pro/3rdparty/

# Ignore the '3rdparty' folder, except for the 'domain' subfolder
/Pro/3rdparty/*
!Pro/3rdparty/domain/

# Ignore the 'domain' folder, except for the 'modulename' subfolder
Pro/3rdparty/domain/*
!Pro/3rdparty/domain/modulename/

Sebagai hasilnya saya lihat di klien git saya bahwa hanya dua file di dalam folder Pro / 3rdparty / domain / modulename / sedang dipentaskan untuk komit berikutnya, dan itulah yang saya cari.

Dan jika Anda perlu memasukkan beberapa subfolder dari folder yang sama maka kelompokkan garis tanda seru di bawah pernyataan kecualikan seperti ini:

# Ignore the 'Pro' folder, except for the '3rdparty' subfolder 
/Pro/*
!Pro/3rdparty/

# Ignore the '3rdparty' folder, except for the 'domain' & 'hosting' subfolders
/Pro/3rdparty/*
!Pro/3rdparty/domain/
!Pro/3rdparty/hosting/

# Ignore the 'domain' folder, except for the 'modulename' subfolder
Pro/3rdparty/domain/*
!Pro/3rdparty/domain/modulename/

# Ignore the 'hosting' folder, except for the 'modulename' subfolder
Pro/3rdparty/hosting/*
!Pro/3rdparty/hosting/modulename/

Kalau tidak bekerja tidak seperti yang diharapkan.


Akhirnya jawaban itu berhasil. Saya ingin tahu kapan saya akan mengerti bagaimana sebenarnya .gitignore berfungsi
David

8

Itulah yang berhasil bagi saya, saya hanya ingin melakukan satu plugin Cordova ke repo:

...
plugins/*
!plugins/cordova-plugin-app-customization

8

Saya tahu saya terlambat ke pesta, tapi inilah jawaban saya.

Seperti kata @ Joakim, untuk mengabaikan file, Anda dapat menggunakan sesuatu seperti di bawah ini.

# Ignore everything
*

# But not these files...
!.gitignore
!someFile.txt

tetapi jika file dengan direktori bersarang, agak sulit untuk secara manual menulis aturan.

Misalnya, jika kita ingin melewatkan semua file dalam suatu gitproyek, tetapi tidak a.txtyang berlokasi di aDir/anotherDir/someOtherDir/aDir/bDir/cDir. Maka, kita .gitignoreakan menjadi seperti ini

# Skip all files
*

# But not `aDir/anotherDir/someOtherDir/aDir/bDir/cDir/a.txt`
!aDir/
aDir/*
!aDir/anotherDir/
aDir/anotherDir/*
!aDir/anotherDir/someOtherDir/
aDir/anotherDir/someOtherDir/*
!aDir/anotherDir/someOtherDir/aDir/
aDir/anotherDir/someOtherDir/aDir/*
!aDir/anotherDir/someOtherDir/aDir/bDir/
aDir/anotherDir/someOtherDir/aDir/bDir/*
!aDir/anotherDir/someOtherDir/aDir/bDir/cDir/
aDir/anotherDir/someOtherDir/aDir/bDir/cDir/*
!aDir/anotherDir/someOtherDir/aDir/bDir/cDir/a.txt

Di atas diberikan .gitignoreFile yang akan melewati semua dir dan file kecuali!aDir/anotherDir/someOtherDir/aDir/bDir/cDir/a.txt

Seperti yang telah Anda catat, sulit untuk mendefinisikan aturan-aturan itu.

Untuk mengatasi rintangan ini, saya telah membuat aplikasi konsol sederhana bernama git-do-not-ign yang akan menghasilkan aturan untuk Anda. Saya telah menginangi proyek di github dengan instruksi terperinci.

Contoh Penggunaan

java -jar git-do-not-ignore.jar "aDir/anotherDir/someOtherDir/aDir/bDir/cDir/a.txt"

Keluaran

!aDir/
aDir/*
!aDir/anotherDir/
aDir/anotherDir/*
!aDir/anotherDir/someOtherDir/
aDir/anotherDir/someOtherDir/*
!aDir/anotherDir/someOtherDir/aDir/
aDir/anotherDir/someOtherDir/aDir/*
!aDir/anotherDir/someOtherDir/aDir/bDir/
aDir/anotherDir/someOtherDir/aDir/bDir/*
!aDir/anotherDir/someOtherDir/aDir/bDir/cDir/
aDir/anotherDir/someOtherDir/aDir/bDir/cDir/*
!aDir/anotherDir/someOtherDir/aDir/bDir/cDir/a.txt

Ada juga versi web sederhana yang tersedia di sini

Terima kasih.


7

Saya memiliki Jquery dan Angular dari bower. Bower memasangnya

/public_html/bower_components/jquery/dist/bunch-of-jquery-files
/public_html/bower_components/jquery/src/bunch-of-jquery-source-files
/public_html/bower_components/angular/angular-files

Jquery yang diperkecil ada di dalam distdirektori dan angular di dalam angulardirektori. Saya hanya perlu file yang diperkecil untuk dikomit ke github. Beberapa mengutak-atik .gitignore dan inilah yang berhasil saya bayangkan ...

/public_html/bower_components/jquery/*
!public_html/bower_components/jquery/dist
/public_html/bower_components/jquery/dist/*
!public_html/bower_components/jquery/dist/jquery.min.js
/public_html/bower_components/angular/*
!public_html/bower_components/angular/angular.min.js

Semoga seseorang dapat menemukan ini berguna.


7

Beginilah cara saya melakukannya:

# Ignore everything
*

# Whitelist anything that's a directory
!*/

# Whitelist some files
!.gitignore

# Whitelist this folder and everything inside of it
!wordpress/wp-content/themes/my-theme/**

# Ignore this folder inside that folder
wordpress/wp-content/themes/my-theme/node_modules

# Ignore this file recursively
**/.DS_Store

Gunakan gig status -uuntuk melihat masing-masing file dalam direktori yang git statustidak dilacak secara rekursif - dengan Anda hanya akan melihat folder, yang dapat membodohi Anda dengan berpikir bahwa semua yang ada di dalamnya dilacak


5

Solusi sederhana jika Anda perlu mengabaikan segalanya kecuali beberapa file dan beberapa folder root :

/*
!.gitignore
!showMe.txt
!my_visible_dir

Keajaiban ada di /*(seperti dijelaskan di atas) itu mengabaikan semua yang ada di folder (root) TAPI TIDAK secara rekursif.


4

Saya juga punya beberapa masalah dengan negasi file tunggal. Saya dapat mengkomitnya, tetapi IDE saya (IntelliJ) selalu mengeluh tentang file yang diabaikan, yang dilacak.

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

Menampilkan dua file, yang saya kecualikan dengan cara ini:

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

Pada akhirnya, ini berhasil bagi saya:

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

Kuncinya adalah negasi dari folder typo3conf/ terlebih dahulu.

Juga, tampaknya urutan pernyataan itu tidak masalah . Alih-alih, Anda perlu meniadakan semua subfolder secara eksplisit, sebelum Anda dapat meniadakan satu file di dalamnya.

Folder !public/typo3conf/dan isi folder public/typo3conf/*adalah dua hal berbeda untuk .gitignore.

Utas hebat! Masalah ini mengganggu saya untuk sementara waktu;)


3

Sejauh ini tidak ada yang berhasil karena saya mencoba menambahkan satu toples dari lib.

Ini tidak berhasil:

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

Ini berhasil:

build/*
!build/libs

3

Saya berhasil ini

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

2

Punya masalah yang sama seperti OP tetapi tidak satupun dari 10 jawaban yang dipilih benar-benar berfungsi .
Saya akhirnya menemukan yang berikut ini

Sintaks yang salah:

*
!bin/script.sh

Sintaks yang benar:

*
!bin
!bin/script.sh

Penjelasan dari halaman manual gitignore :

Awalan opsional "!" yang meniadakan pola; setiap file yang cocok dikecualikan oleh pola sebelumnya akan dimasukkan lagi. Tidak mungkin untuk memasukkan kembali file jika direktori induk dari file itu dikecualikan . Git tidak mencantumkan direktori yang dikecualikan untuk alasan kinerja, jadi pola apa pun pada file yang terkandung tidak memiliki efek, di mana pun mereka didefinisikan.

Contoh yang diperluas:

$ pohon.

.
├── .gitignore
└── bin
    ├── ignore.txt
    └── sub
        └── folder
            └── path
                ├── other.sh
                └── script.sh

$ cat .gitignore

*
!.gitignore
!bin
!bin/sub
!bin/sub/folder
!bin/sub/folder/path
!bin/sub/folder/path/script.sh

Status $ git --untracked-files --ignored

On branch master

No commits yet

Untracked files:
  (use "git add <file>..." to include in what will be committed)
        .gitignore
        bin/sub/folder/path/script.sh

Ignored files:
  (use "git add -f <file>..." to include in what will be committed)
        bin/ignore.txt
        bin/sub/folder/path/other.sh

nothing added to commit but untracked files present (use "git add" to track)

1

Inti

# Ignore everything
*

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

Dan mungkin termasuk:

!.gitignore

Referensi

Dari https://git-scm.com/docs/gitignore :

Awalan opsional " !" yang meniadakan pola; setiap file yang cocok dikecualikan oleh pola sebelumnya akan dimasukkan lagi. Tidak mungkin untuk memasukkan kembali file jika direktori induk dari file itu dikecualikan. Git tidak mencantumkan direktori yang dikecualikan untuk alasan kinerja, jadi pola apa pun pada file yang terkandung tidak memiliki efek, di mana pun mereka didefinisikan. Letakkan backslash (" \") di depan " !" pertama untuk pola yang dimulai dengan " !" literal , misalnya, " \!important!.txt".

...

Contoh untuk mengecualikan semua kecuali direktori tertentu foo/bar(perhatikan /*- tanpa slash, wildcard juga akan mengecualikan semua yang ada di dalamnya foo/bar):

$ cat .gitignore
# exclude everything except directory foo/bar
/*
!/foo
/foo/*
!/foo/bar

0

Sepertinya saya telah menemukan sesuatu yang bekerja untuk saya yang tidak disebutkan orang lain.

# 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/**/*

Pada dasarnya, tampaknya meniadakan sub-direktori agar tidak diabaikan, Anda harus memiliki dua entri, satu untuk sub-direktori itu sendiri !subdir/dan kemudian satu lagi yang mengembang ke semua file dan folder di bawahnya.!subdir/**/*

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.