git güncelleme-indeksi - dizinde-değiştirilmedi


101

git 1.7.12

Belirli bir dizinin altındaki tüm dosyaları değiştirilmedi olarak işaretlemek istiyorum.

1) git update-index --assume-unchaged dir/"Yolu görmezden geliyor" verir.

2) git update-index --assume-unchaged dir/*izlenmeyen dosyalarla karşılaşacağı için hızlı bir şekilde başarısız olur, bu nedenle "ölümcül: Dosya işaretlenemiyor" verir ve çıkar.

3) İşaretlenecek dosyaların bir listesini oluşturmayı deneyin. cdistenen dizine girin ve ardından çalıştırın git ls-files | tr '\n' ' ' | git update-index --assume-unchanged. Bu herhangi bir hata mesajı vermez, ancak dosyaları başarılı bir şekilde işaretlemez. Komutun ilk bölümü, git ls-files | tr '\n' ' 'işaretlemek istediğim tüm dosyaların boşlukla sınırlandırılmış bir listesini doğru şekilde oluşturur. Bu komutun çıktısını kopyalayıp komut satırına yapıştırırsam, o zaman git update-indexkomut çalışır. Borularla ne çalışmıyor?

Hayır, dir.gitignore'a eklemem yeterli değil . Bu dosyaların arşivde olmasına ihtiyacım var, ancak yerel olarak istenmeyen değişiklikler yapılacak ve kullanıcıların çekebilmesi için göz ardı edilmesi gerekiyor.

Yanıtlar:


176

git update-index dosya adlarını standart girdisinde değil, komut satırında ister.

Aşama 1:

cd değişmemiş olduğunu varsaymak istediğiniz klasöre

Adım 2:

Şunlardan birini yapabilirsiniz:

git update-index --assume-unchanged $(git ls-files | tr '\n' ' ')

veya

git ls-files | tr '\n' ' ' | xargs git update-index --assume-unchanged

Her iki durumda da, boşluklu dosya adları sorunlu olacaktır. Bunlara sahipseniz, bunu kullanabilirsiniz:

git ls-files -z | xargs -0 git update-index --assume-unchanged

Düzenleme: @ MatthewScharley'den gelen girdi ile ilgili git ls-files -z.

Windows Komutları

Not: Windows kullanıyorsanız, bu komutları çalıştırmak için Git Bash'i kullanın


2
Bilginize, bu `| tr '\ n' '' 'biti gereksizdir.
Václav Slavík

7
@twalberg: Sadece kullanabilirsingit ls-files -z
Matthew Scharley

2
@twalberg "git ls-files -z | xargs -0 git update-index --assume-unchanged" komutu nasıl geri alınır
Mohamed Hussain

3
@MohamedHussain git ls-files -z | xargs -0 git update-index --no-assume-unchanged, I would think ...
twalberg

1
git ls-files -z | git update-index -z --stdindaha temiz.
Jed

22

findGNU Findutils gelen komutu bir sahiptir -execkullanarak uğraşmadan en kaldırır seçeneğixargs onun sözdizimi biraz özel olmasına rağmen. Ancak boşluk içeren dosya adlarıyla mükemmel bir şekilde ilgilenir.

Bu komut, git'in listelenen dizindeki ve altındaki tüm dosyaların değişmediğini varsaymasını sağlar:

find path/to/dir -type f -exec git update-index --assume-unchanged '{}' \;

Bul sonraki her argüman alır -execkadar ;yerine takarken (Kabuk yiyor o diye kaçmaya sahip olan) ve her dosya bulunamadı için bir kez çalıştırır {}bulunan dosyayı adı ile (kabuk yemek olmaz bu yüzden yine tek tırnaklı).

findEşleştirme ölçütlerini kullanarak (maksimum özyineleme derinliği, eşleşmenin bir dosya veya dizin olması, dosya adının bir ifadeyle eşleşip eşleşmemesi) ve -execher türlü güçlü şeyi yapabilirsiniz.

findKomutun diğer uygulamaları hakkında emin değilim . YMMV.


2
-execstandart bir seçenektir . Ayrıca -exec git update-index --assume-unchanged {} +, komuta aynı anda birden çok dosya adı aktararak git komutunun çalıştırılma sayısını azaltan (standart tarafından da tanımlanır) yapabilirsiniz.
Tom Fenech

16

Dizin adını ekleyin .git/info/exclude. Bu izlenmeyen dosyalar için işe yarar.


Bu harika çalışıyor! Bunun dosyalarla da çalışıp çalışmadığını biliyor muydunuz?
betomoretti

Ancak bu, izlenmeyen dosyaları github'a zorlamaz! Bunları kayıtlardan görmezden gelip aslında depolarda tutmanın bir yolu var mı?
Mahmoud Zalt

2

Evet,

git update-index --assume-unchanged

dizinlerle değil, yalnızca dosyalarla çalışır. Sanırım daha hızlı yollardan biri:

cd dir
ls | xargs -l git update-index --assume-unchanged

2
Bunun yerine kullanmanın cdolduğundan, son argüman olarak dir geçirebilirsiniz: git ls-files -- $DIR | xargs -l git update-index --assume-unchanged -- $DIR.
kzh
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.