2012-11-29 11 views
240

Depomda işlemek istemediğim bir dosyada yerel değişiklikler yapıyorum. Uygulamayı bir sunucuda oluşturmak için bir yapılandırma dosyasıdır, ancak farklı ayarlarla yerel olarak oluşturmak istiyorum. Doğal olarak, dosya her zaman için bir durum olarak 'git durumunu' yaptığımda görünür. Bu değişikliği saklamak ve taahhüt etmemek istiyorum. Dosyada başka değişiklik yapmayacağım. etrafında kazma bazı sonra Git - 'Assume-unchanged' ile 'Skip-worktree' Arasındaki Fark

, ben 2 seçeneği görmek: 'skip-worktree' '-değişmeden farz' ve. Önceki bir soru here onlardan bahseder, ancak farklılıklarını gerçekten açıklamıyor. Benim sorum şu: İki komut nasıl farklı? Neden biri birini veya diğerini kullanır?

+0

Genellikle benzer amaçlar için '.gitignore' kullanıyorum. Bu çözüm sizin için çalışır mı? – samuil

+15

samuil, .gitignore eklemeyi değil, değiştirmeyi göz ardı ediyor. Dosya zaten git gitmişse, bu olay listelendiyse, izlenen olay izlenir. – Grigory

+0

@Grigory Bunu bilmiyordum. Teşekkürler! –

cevap

346

skip-worktree.

assume-unchanged o dosyaların bir grup modifiye edilmiş olup olmadığını kontrol etmek pahalıdır durumlar için tasarlanmıştır; biti ayarladığınızda, git (tabii ki), indeksin o kısmına karşılık gelen dosyaların çalışma kopyasında değiştirilmediğini varsayar. Dolayısıyla, stat çağrılarının karmaşasını önler. Bu bit, dosyanın dizindeki girdisi değiştiğinde kaybolur (böylece, dosya yukarı yönde değiştirildiğinde).

skip-worktree daha fazlasıdır: gitdizinden sürümünü kullanarak, dosya değiştirilmiş olduğunu bilir (ya da reset --hard ya da benzeri ile değiştirilmesi gerekiyor) olmamıştır, onu taklit edecek durumlarda bile yerine. Bu, dizin atılana kadar devam eder.

burada bu farkın sonuçlarıyla ve tipik kullanım durumları iyi özeti vardır: http://fallengamer.livejournal.com/93321.html. Bu makaleden

:

  • --assume-unchanged varsayar bir geliştirici değil değişiklik dosya gerektiği. Bu bayrak, SDK'lar gibi klasörleri değiştirmeyen öğeler için performansı artıran anlamına gelir. Eğer geliştiriciler değiştirmek gerekir şimdiye çünkü belirli bir dosyayı dokunmamaya budala talimatını
  • --skip-worktree yararlıdır. Örneğin, ana depo yukarı üretim bazı hazır yapılandırma dosyalarını barındıran ve yanlışlıkla bu dosyaları değişiklikleri yapmak istemiyorsanız, --skip-worktree tam olarak ne istediğinizi.
+3

Bu mantıklı. Atla-worktree gerçekten gitmek için bir yol gibi görünüyor. Teşekkürler! – ckb

+2

İki komutla ilgili daha fazla bilgiyi [git-update-index (1) El ile Sayfa] 'da bulabilirsiniz (http://git-scm.com/docs/git-update-index). – Senseful

+44

Arama ve okuma birkaç saniye kaydetmek için küçük bir not. '--skip-worktree' efektlerini iptal etmek ve bayrağı kaldırmak için' -no-skip-worktree' seçeneği vardır. Tam olarak aynı şekilde çalışır. Bu, bir elin kayması ve yanlış dosyaların işaretlenmesi veya koşulların değişmesi ve daha önce atlanan dosyaların artık göz ardı edilmemesi durumunda yararlıdır. – drdaeman

61

Not: fallengamer (böylece modası geçmiş olabilir) 2011 yılında bazı testler yaptı ve burada yaptığı findings şunlardır:

  • Dosya yerel depoda ve memba hem değiştirilir

    Operasyonlar Zaten yerel değişiklikleri koruyan Git, zaten varsa, yerel değişiklikleri koruyor.
    Böylece, herhangi bir bayrakla işaretlediğiniz herhangi bir veriyi kazara kaybetmezsiniz.assume-unchanged bayrağıyla

    • Dosya: Git yerel dosyanın üzerine olmaz. Bunun yerine çıkar çatışmaları çıktı ve bunların nasıl çözüleceğini önerdi
    • Dosya skip-worktree flag: Git yerel dosyanın üzerine yazılmaz. Bunun yerine çıkış çatışmalar ve tavsiyeleri onları

çözmek için nasıl.

  • Dosya zaten
    git stash
    git pull
    bazı ekstra manuel çalışmalarında skip-worktree sonuçları kullanarak ama en azından herhangi bir veri kaybetmek olmaz çekmeye çalışıyordu, yerel depoda ve memba hem değiştirilir yerel değişikliklerin varsa. assume-unchanged bayrağıyla
    • Dosya: onları geri olanağı olmaksızın tüm yerel değişiklikleri atar. Efekt, ‘git reset --hard’ gibidir. ‘git pull’ çağrısı skip-worktree bayrağıyla
    • Dosya başarılı olacaktır: Stash skip-worktree dosyalar üzerinde işe yaramaz. 12 git pull ’, yukarıdakiyle aynı hatayla başarısız olacaktır. Geliştirici, başarısız olan pull'u saklamak ve tamamlamak için skip-worktree bayrağını el ile sıfırlamaya zorlanır.

.

  • Hiçbir yerel değişiklikler, memba dosya üst düzey değişiklikleri almanızı önleyebilir olmaz
    git pull
    Hem bayraklar değişti. Git, assume-unchanged sözünü bozduğunuzu algılar ve bayrağı sıfırlayarak gerçeği yansıtacak şekilde seçer. assume-unchanged bayrağıyla
    • Dosya: İçerik güncellenir, bayrak kaybolur.
      git ls-files -v’, işaretin H olarak değiştirildiğini gösterir (h).
    • Dosya skip-worktree bayrak: İçerik güncelleştirildi, bayrak korunuyor.
      git ls-files -v ', pull numaralı telefondaki gibi aynı S bayrağını gösterir.

.yerel bir dosya ile

  • assume-unchanged dosya için (dosya aslında değiştirildi değişmeden olmak için söz verdi) skip-worktree dosya dokunmaz git reset --hard
    Git
    değişti ve gerçeği yansıtır. assume-unchanged bayrağı ile
    • Dosya: Dosya içeriği döndürülür. Bayrak H olarak sıfırlandı (h'dan).
    • dosyasıyla dosya skip-worktree flag: Dosya içeriği bozulmamıştır. Bayrak aynı kalır.

Ertesi analizi ekler: skip-worktree olduğunu yerel verilerinizi korumak için çok sıkı çalışıyor gibi

  • görünüyor. Ancak güvenliyse akışaşağı değişikliklerini almanızı engellemez. Git, bayrağı pull numaralı telefondan sıfırlamıyor.
    Ancak ‘reset --hard 'komutunu göz ardı etmek, bir geliştirici için kötü bir sürpriz olabilir.

  • Assume-unchanged bayrak pull operasyon kaybolabilir ve bu tür dosyaları içinde yerel değişiklikler git'e önemli olduğu görünmüyor.

Bkz:

da buraydı bayrakların Aslında

ne kadar sezgiseldir.

  • assume-unchanged bir geliştirici bir dosyayı değiştirmek gerektiğini varsayar. Bir dosya değiştirildiyse - bu değişiklik önemli değildir. Bu bayrak, SDK'lar gibi değişmeyen klasörler için performansın iyileştirilmesi anlamına gelir.
    Ancak söz verilmişse ve bir dosya değiştirilmişse, git gerçekliği yansıtacak şekilde bayrağı geri alır. Muhtemelen, genellikle değiştirilmemesi gereken klasörlerde tutarsız bayrakların olması iyi olur. Hiç belirli bir dosyayı dokunmamaya budala talimatını Öte yandan skip-worktree günü

  • yararlıdır. Bu zaten izlenmiş bir yapılandırma dosyası için kullanışlıdır.
    Upstream ana deposu bazı hazır kullanıma hazır yapılandırmayı barındırır, ancak bazı yerel sınamalar yapabilmek için yapılandırmadaki bazı ayarları değiştirmek istersiniz. Ve bu dosyadaki değişiklikleri üretim yapılandırmasını etkilemek için yanlışlıkla kontrol etmek istemezsiniz.Bu durumda skip-worktree mükemmel bir sahne yapar.

+5

Bir dosyada atlama-worktree varsa ve akış yukarı yönde değişirse, git durumu dosyayı değiştirilmiş olarak bildirmese bile, çekmeye çalıştığınızda "lütfen işlemi gerçekleştirin veya stash" yazın. Bunu nasıl önleyebilirsiniz ki, insanlar menşeindeki üretim ayarları ile uğraşırken yerel değişiklikler devam edebilir mi? – GreenAsJade

+0

@GreenAsJade Emin: Bu kendi başına iyi bir soru olurdu (buna bir bağlantı ile). "Skip-worktree" yerine "değişmeyen" ile benzer bir mesaj alacağınızı varsayalım. – VonC

+3

Evet, yaptığını onaylayabilirim. Bu, kökeni farklı bir şekilde korumak istediğiniz yerel bir dosyaya sahip olmanızın hala çok zor olduğu anlamına gelir. – GreenAsJade