Gitignore'da baştaki eğik çizgi ne zaman kullanılır?


108

.gitignoreSözdizimini daha net anlamaya çalışıyorum ve özellikle de https://github.com/github/gitignore gitignores söz konusu olduğunda.

Baştaki eğik çizginin yalnızca .gitignoredosyanın konumuna göre yol adlarını eşleştirmek için kullanıldığını görüyorum ( http://git-scm.com/docs/gitignore adresinden ):

Baştaki eğik çizgi, yol adının başlangıcıyla eşleşir. Örneğin, "/*.c", "cat-file.c" ile eşleşir ancak "mozilla-sha1 / sha1.c" ile eşleşmez.

Peki baştaki eğik çizgiyi kaldırdığımda ne olur? Anladığım kadarıyla iki durum var:

  1. Kalıp bir bölü çizgisi içermiyorsa (veya sadece sonda bir bölü çizgisi içeriyorsa, yani bir dizinle eşleşmesi gerektiği anlamına gelir), arama tüm dizin ağacının içinde gerçekleştirilir. Örneğin, desen dir/maç olacak <root>/dir, <root>/a/dir, <root>/a/b/c/.../dirvb nerede <root>konumudur .gitignoredosyası.
  2. Desen sondaki konumda olmayan bir eğik çizgi içeriyorsa (bu son karakter değilse), o zaman sadece .gitignoredosya konumuna göre yol adlarıyla eşleştirilir .

Bu davranışı kontrol etmek için yaptığım örnekler şunlar:

# Directory structure:
<root>
├─ dir/
│   └─ test
├─ src/
│   ├─ dir/
│   │   └─ test
test file is there only because Git does not track empty directories.

İlk test:

# .gitignore
dir/

# git status
nothing to commit

Yani Git her iki dirdizini de görmezden geliyor . Bu, 1 numaralı durumla tutarlıdır: örüntüde eğik çizgi yoktur (sondaki hariç), bu nedenle Git, kalıpla eşleşen her şeyi görmezden gelerek tüm dizin ağacını izliyor.

İkinci test:

# .gitignore
/dir/

# git status
Untracked files:
    src/

Burada Git, dirdesendeki baştaki eğik çizgi sayesinde yalnızca doğrudan kök dizinin altındaki dizini görmezden geliyor .

Üçüncü test:

# .gitignore
dir/*

# git status
Untracked files:
    src/

Bu, 2 numaralı durumla tutarlıdır: örüntü içinde bir miktar eğik çizgi vardır, bu nedenle kök dizinden başlayan bir yol adı olarak kabul edilir.

Şimdi gerçek soru zamanı. Şu gitignore dosyasını ele alalım : downloader/örneğin, dizini yok saydıklarında , aslında downloadertüm dizin ağacında bulunan her bir dizini görmezden gelmiyorlar mı? Git'in işleyişiyle ilgili daha önce gördüğümden beri düşünmeye itildiğim şey bu.

Öyleyse, downloaderiçinde bir dizin bulunan özel bir modülüm olursa, Magento'nun kökündeki normal modülün yanı sıra beklenmedik bir şekilde yok sayılacak mı? Bu biraz retorik bir soru çünkü aslında zaten başıma geldi ve bulunması gerçekten zor bir hata yarattı.

Yani, Magento .gitignoredosyasında (sadece bir örnek olarak bahsediyorum, btw) birçok desen eğik çizgi içerir, bu nedenle bunlar kökten başlayarak yol adlarıyla doğru bir şekilde eşleşir, ancak birkaç durum vardır, bunun gibi downloader/veya errors/bunun gibi yanılmıyorsam eğer, potansiyel olarak tehlikeli olan ve hangi muhtemelen şekilde değiştirilmelidir /downloader/ve /errors/.

Daha genel bir soru olarak, açıkça kökten başlayan bir yol adı seçmek istediğimde ve eğik çizgi içeren desenler için kullanmak istemediğimde (sondaki hariç) eğik çizgi içermeyen desenler için her zaman baştaki eğik çizgiyi kullanmalı mıyım, yoksa bunu yapmalı mıyım? netlik için her zaman baştaki eğik çizgiyi kullanın? Bu konu hakkında ne düşünüyorsun?

Okuduğunuz için teşekkürler ve uzun gönderi için özür dilerim.


8
Harika bir soru ve gerçekten güzel bir açıklama, ben de bundan rahatsız oldum ve araştırmanız her şeyi bana netleştirdi. Bunu okuduktan sonra, kökten başlamalılarsa yollara her zaman eğik çizgi ile başlamanın iyi bir uygulama olduğunu, niyeti daha açık hale getirdiğini söyleyebilirim.
Martinsos

4
Teşekkürler :) Niyeti daha açık hale getirmek için eğik çizgi kullanma hakkındaki notunuza katılıyorum.
swahnee

8
Bu, .gitignore belgelerinin bir parçası olmalıdır. Anlaması çok daha kolay!
rmorrin

Bu harika gönderinin soru cevap bölümlerine ayrıldığını görmek isterim ...
Barett

Yanıtlar:


25

Gelecekteki olası hızlı referans için özetlemek istedim - baştaki eğik çizgi eşleşmeyi köke sabitler. Böylelikle, aşağıdaki örnekte, eğik çizgi olmadan, joker karakter foo içindeki her şeyi dışarıda bırakır çünkü *ağaçtan özyinelemeli olarak aşağı iner ve hareket eder. Bununla birlikte, ile /*, foo klasörü ve içeriği dışındaki her şeyi hariç tutar:

$ cat .gitignore
/*
!/foo

24

Kendi sorunuzu tamamen cevapladınız. Github / gitignore deposuna daha yakından bakarsanız, çoğu dosyanın kalıpların nasıl yazıldığı konusunda tutarsız kurallar kullandığını görürsünüz; Muhtemelen en çok, sizin yaptığınız gibi belgeleri okumaya veya bir şeyleri test etmeye zahmet etmeyen insanlar tarafından katkıda bulunulmuştur.

Bu yardımcı olursa: Haklısın, kendinden emin ol.

Bunun gibi işbirlikçi projelerde hatalar görürseniz, bilginize katkıda bulunmaktan çekinmeyin. Bile var bazı emsal daha da güven oluşturmak için gerekiyorsa.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.