git abaikan pengecualian

326

Saya punya file gitignore yang membuat git mengabaikan *.dllfile, dan itu sebenarnya perilaku yang saya inginkan. Namun, jika saya ingin pengecualian (yaitu untuk dapat melakukan foo.dll), bagaimana saya bisa mencapai ini?

krisis bundar
sumber
8
kemungkinan rangkap dari Pengecualian di .gitignore
wallyk
fwiw, kakek dari jawaban duplikat pada topik ini - yang harus Anda perhatikan - mungkin akan membuat .gitignore mengabaikan semuanya kecuali beberapa file - aktivitas yang sangat teratur dan beberapa jawaban yang baik. Saya penggemar tertentu dari jawaban ini , yang tampaknya jelas dan menyeluruh.
Kay V

Jawaban:

447

Menggunakan:

*.dll    #Exclude all dlls
!foo.dll #Except for foo.dll

Dari gitignore :

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

Skilldrick
sumber
22
Lihat juga jawaban dari @Matiss Jurgelis - tambahan penting
Dan
7
Bisakah saya menambahkan pengecualian ke gitignore proyek saya dan bukan global gitignore saya? Misalnya, jika saya ingin menyertakan semua DLL dalam direktori? Gitignore_global saya ada *.dlldi dalamnya, dan gitignore proyek saya memiliki !Libs/*.dlltetapi tampaknya tidak berfungsi.
Joel Kinzel
1
@ Jakkin, Anda harus mencoba !Libs/**/*.dll.
Rosberg Linhares
@RosbergLinhares Atau !**/Libs/*.dll, tergantung pada struktur folder.
JAB
2
Terima kasih, tetapi pada mac menambahkan komentar pada baris yang sama dengan !foo.dlltidak membatalkan perintah. Jika saya menambahkan komentar pada baris yang terpisah itu berfungsi.
Giacomo
261

Git mengabaikan folder jika Anda menulis:

/js

tetapi tidak dapat menambahkan pengecualian jika Anda lakukan: !/js/jqueryatau !/js/jquery/atau!/js/jquery/*

Anda harus menulis:

/js/* 

dan hanya dengan begitu Anda bisa kecuali subfolder seperti ini

!/js/jquery
Matiss
sumber
44
Itu sangat penting. Terima kasih!
VisioN
3
Namun sepertinya Anda tidak dapat menambahkan folder bersarang, mis. !/js/jquery/xyzlibTidak akan diabaikan ...
Abaikan
2
Seperti yang dikatakan @Ignorant, folder yang Anda "kecuali" dari aturan abaikan, harus berada di lokasi yang sama dengan "*"
The Red Pea
3
jadi /js/*, !/js/jquery, /js/jquery/*, !/js/jquery/xyzlib? Terasa seperti cara yang lucu untuk melakukannya ...
Imperishable Night
Anda benar-benar membantu saya.
Loyea
55

Anda bisa saja git add -f path/to/foo.dll.

.gitignore mengabaikan hanya file untuk pelacakan biasa dan hal-hal seperti git add .

Nils Riedemann
sumber
4
Hanya untuk lebih jelasnya, -fgit memberitahu untuk memaksa penambahan file ini dalam repo karena mungkin mengabaikannya terlebih dahulu karena Anda.gitignore
RPDeshaies
Yang hebat jika Anda hanya memiliki satu file, kurang berguna jika Anda memerlukan pola
Liam
19

Untuk mengecualikan semua yang ada di direktori, tetapi beberapa subdirektori, lakukan hal berikut:

wp-content/*
!wp-content/plugins/
!wp-content/themes/

Sumber: https://gist.github.com/444295

Simon Paarlberg
sumber
15

Cukup tambahkan !sebelum aturan pengecualian.

Menurut halaman manual gitignore :

Pola memiliki format berikut:

...

  • Awalan opsional! yang meniadakan pola; file yang cocok tidak termasuk oleh pola sebelumnya akan dimasukkan lagi. Jika pola yang dinegasikan cocok, ini akan menimpa sumber pola prioritas yang lebih rendah.
Robert Munteanu
sumber
5

!foo.dll di .gitignore, atau (setiap saat!) git add -f foo.dll

Tobias Kienzler
sumber
4

Jika Anda bekerja dengan Visual Studio dan .dll Anda berada di binfolder, maka Anda harus menambahkan pengecualian untuk folder bin itu sendiri, sebelum Anda dapat menambahkan pengecualian untuk file .dll. Misalnya

!SourceCode/Solution/Project/bin
!SourceCode/Solution/Project/bin/My.dll

Ini karena .gitignorefile Visual Studio default termasuk pola abaikan untuk[Bbin]/

Pola ini men-zapping semua folder bin (dan akibatnya isinya), yang membuat segala upaya untuk memasukkan konten yang berlebihan (karena folder itu sendiri sudah diabaikan).

Saya dapat menemukan mengapa file saya tidak dikecualikan dengan menjalankan

git check-ignore -v -- SourceCode/Solution/Project/bin/My.dll

dari jendela Git Bash. Ini mengembalikan [Bbin]/polanya.

DeanOC
sumber
2

Solusinya tergantung pada hubungan antara aturan abaikan git dan aturan pengecualian:

  1. File / File pada level yang sama: gunakan solusi @Skilldrick .
  2. Folder / Subfolder: gunakan solusi @Matiss Jurgelis .
  3. File / File di berbagai tingkatan atau File / Subfolder: Anda dapat melakukan ini:

    *.suo
    *.user
    *.userosscache
    *.sln.docstates
    
    # ...
    
    # Exceptions for entire subfolders
    !SetupFiles/elasticsearch-5.0.0/**/*
    !SetupFiles/filebeat-5.0.0-windows-x86_64/**/*
    
    # Exceptions for files in different levels
    !SetupFiles/kibana-5.0.0-windows-x86/**/*.suo
    !SetupFiles/logstash-5.0.0/**/*.suo
    
Rosberg Linhares
sumber
1

Karena Git 2.7.0 Git akan mempertimbangkan pengecualian. Dari catatan rilis resmi:

  • Izinkan "! / Abc / def" yang lebih baru untuk mengganti "/ abc" yang sebelumnya muncul dalam file .gitignore yang sama untuk membuatnya lebih mudah untuk mengekspresikan "semua yang ada di direktori / abc diabaikan, kecuali untuk ...".

https://raw.githubusercontent.com/git/git/master/Documentation/RelNotes/2.7.0.txt

Erfan
sumber
1
apakah ini bekerja untuk siapa saja? sepertinya tidak bekerja untuk saya.
Ankur