Git belirli bir satırı görmezden gelebilir mi?


115

Telefonun yerel tarayıcısında test ederken phonegap ile senkronize etmek için git kullanıyorum. Bu nedenle şu satıra sahibim:

var isPhoneGap = false;

Açıkçası bunu inşa ederken değiştiriyorum, ama git'i bu tek satırı görmezden gelmek için ayarlayabileceğim herhangi bir yol var mı yoksa gidip kendi dosyasına koymam ve bu şekilde görmezden gelmem mi gerekiyor?

Gitx'i ve OSX 10.6'daki terminali kullanıyorum.


@ user494461: Git filtreleri bunu yapmanın yoludur: stackoverflow.com/a/16244970/520162
eckes

1
Ortamı algılayıp bir eniroment yapılandırma dosyası kullanamıyor musunuz?
exussum

Kısaca: Hayır. Ancak, yorumlanmış belirli kodları arayan ve git'e yayınlamadan önce kaldıran bir önişlemci komut dosyası yazdım. Buraya göz atın: github.com/franklinchou/ahk_config/blob/master/preprocess.sh
franklin

Yanıtlar:


104

Dosyanız belirli bir türdeyse, bir dosyada tanımlayabileceğiniz bir içerik filtresi sürücüsü bildirebilirsiniz .gitattributes(" Git Öznitelikleri " nin "Anahtar Kelime genişletme" bölümünde sunulduğu gibi ):

http://git-scm.com/figures/18333fig0702-tn.png

*.yourType filter=yourFilterName

(isterseniz bu filtreyi belirli bir dosya için bile ayarlayabilirsiniz )

Uygulanışı:

  • yourFilterName.smudge(tetiklendi git checkout) ve

    git config --global filter.yourFilterName.smudge 'sed "s/isPhoneGap = .*/isPhoneGap = true/"'
    
  • yourFilterName.clean(tetiklendi git add)

    git config --global filter.yourFilterName.clean 'sed "s/isPhoneGap = .*/isPhoneGap = false/"'
    

Dosyanız tarihinde değişmemiş görünecek git status, ancak teslim alınan sürümü için doğru değere sahip olacaktır isPhoneGap.


1
Bunun için teşekkürler. işe yaradı. git diff or Git statüsünü nasıl yapacağınızı biliyor musunuz , yine de filtreleri görmezden gelin? Yani hala neyin farklı olduğunu görebilir miyim? Benim kullanım durumum hata ayıklama günlükleri içindir ... ki sonunda silmek istiyorum ... @jthill @VonC
timh

1
@timh, filtre çalışıyorsa, git status veya git diff hiçbir şey göstermemelidir.
VonC

1
GIT'de daha basit bir yol olmaması üzücü. git ignore <dosya adı> <hat numarası> çok kullanışlı olurdu!
kiedysktos

22
@kiedysktos keten numarası? Ya satır numarası değişirse?
VonC

Bu harika çalıştı, ancak Windows kullanıcıları dikkat edin, gitconfig hangi karakterleri tutmak istediği konusunda çok seçicidir, bu nedenle bazı yarı egzotik normal ifadeleri denerken sorunla karşılaşabilirsiniz. Sed-çağrılarımı, sh ".git/helper.sh"sed ile herhangi bir parametreyi geçerek sed ile "$@"gittiğimden emin olarak gitconfig'den çağırdığım ayrı bir helper.sh dosyasına koydum (sadece dosya yolunun geçtiğini varsayıyorum).
ohaal

43

Kullanabilirsiniz

git update-index --assume-unchanged [file]

izlemek istemediğiniz bir dosyanın değişikliklerini yok saymak için. Depoda bir dosyaya ihtiyacım olduğunda bu çözümü kullanıyorum, ancak bu dosya her zaman izlemeye ihtiyacım olmayan değişen bazı bölümlere sahip.

Dosyada önemli değişiklikler olduğunda, bunu yapmanız gerekir:

git update-index --no-assume-unchanged [file]

Ayrıca, parametre için Git doc güncelleme dizinine bakın --[no-]assume-unchanged.

Bu bayraklar belirtildiğinde, yollar için kaydedilen nesne adları güncellenmez. Bunun yerine, bu seçenekler yollar için "değişmediğini varsay" bitini ayarlar ve kaldırır. "Değiştirilmediğini varsayalım" biti açık olduğunda, git çalışma ağacı dosyalarını olası değişiklikler için kontrol etmeyi durdurur, bu nedenle çalışma ağacı dosyasını değiştirdiğinizde git'e söylemek için biti manuel olarak kaldırmanız gerekir.


2
Bunu yapmak, git pull yaptığımda yeni sürümü getirmeye devam edecek mi?
Saad Rehman Shah

1
@Caffeine git pull yaptığınızda, kaydedilen son sürümü alırsınız, bu, dosyayı '--assume-unchanged' olarak değiştirmeden önceki son sürüm olacaktır.
Carlos

1
--skip-worktreeÇoğu amaç için daha iyi bir seçenek olduğuna inanıyorum . stackoverflow.com/a/39583010/4233593
Jeff Puckett


3
bu, belirli bir satır değil, tüm dosyadaki güncellemeleri yok sayar
nikoss

6

Gitx, tek tek satırları işlemenize veya görmezden gelmenize izin vermelidir (bunu zaten biliyor olabilirsiniz), ancak bunu her taahhüt ettiğinizde yapmanız gerekir. Her dağıtım hedefi için bir yapılandırma dosyasına sahip olmanın daha iyi olacağını düşünüyorum (bunları sürümleyebilirsiniz) ve bazı çalışma zamanı parametreleri, ancak sunucuyu başlatıyor olsanız da (gibi ./myserver --config=whatever.js).


5

Sürekli https://stackoverflow.com/a/20574486/4935114 , @ Mike bir oluşturmak için önerilen pre-commitolacak kanca grepkimsenin görmezden isteyebilirsiniz hatları için dosyaları sahnelenen içinde. Kanca, bu satırların aşamalı olup olmadığını kontrol eder. Eğer öyleyse, bu bir echouyarıdır ve exitkod içerir, 1bu yüzden commit işlemi devam etmez.

@ Mike'ın cevabından esinlenerek , kendimi belki de görmezden gelmek istediğimiz belirli bir çizgiyi otomatik olarak reset ( -pbayrakla birlikte) kullanan kancasının geliştirilmiş bir versiyonunu kullanırken buldum .

Bu kancanın, bu satırda göz ardı edilecek birçok dosyanızın olduğu bir durumda işe yarayacağından emin değilim, ancak bu pre-commitkanca belirli bir dosyada bu satırda bir değişiklik arar buildVars.java. Kanca betiği makinemde test ettiğimde böyle görünüyordu.

#!/bin/sh

# this hook looks for lines with the text `var isPhoneGap = false;` in the file `buildVars.java` and it resets these lines to the previous state before staged with `reset -p`

if [[ $(git diff --no-ext-diff --cached buildVars.java | grep --count -e "var\ isPhoneGap[\ ]*=[\ ]*") -ne 0 ]]; then
    cat <<EOW
WARNING: You are attempting to commit changes which are not supposed to be commited according to this \`pre-commit\` hook
This \`pre-commit\` hook will reset all the files containing this line to it's previous state in the last commit.
EOW
    echo /$'\n'isPhoneGap$'\n'y$'\n'q | git reset -p
    # BONUS: Check if after reseting, there is no actual changes to be commited and if so, exit 1 so the commit process will abort.
    if [[ $(git diff --no-ext-diff --cached | wc -l) -eq 0 ]]; then
        echo there are no actual changes to be commited and besides the change to the variable \'isPhoneGap\' so I won\'t commit.
        exit 1
    fi
fi

açıklama

Yaptığım şey, isPhoneGapetkileşimli bir resetişlem sırasında normal ifadeyi arayan bir kontrol dizilerini tekrarlamaktı . Böylece /, aramak için baskı yapan bir kullanıcıyı taklit eder isPhoneGap, ybu yamayı iptal etmek isteyip istemediği sorulduğunda basar ve sonunda qinteraktiften çıkmak için basar reset.

Etkileşimli ters yama işlemi burada belgelenmiştir: https://git-scm.com/docs/git-add#git-add-patch


NOT: Değişkenin interactive.singleKeyolduğunu varsayan yukarıdaki komut dosyası false. Size seninkini yapılandırılmış ise true, herhangi kaldırmak $'\n'gelen echosağ uyarıdan sonra komuta.


3

Git filtreleri ile bunu şu şekilde yapabilirsiniz :

  1. Gitattributes dosyası oluştur / aç:
    • <proje kökü> /. gitattributes (depoya kaydedilecek)
      VEYA
    • <proje kökü> /. git / info / öznitelikler (depoya kaydedilmeyecek)
  2. Filtrelenecek dosyaları tanımlayan bir satır ekleyin:
    • *.rb filter=gitignore, yani gitignoretüm *.rbdosyalarda adlandırılmış filtre çalıştırın
  3. gitignoreFiltreyi şurada tanımlayın gitconfig:
    • $ git config --global filter.gitignore.clean "sed '/#gitignore$/'d"yani bu satırları sil
    • $ git config --global filter.gitignore.smudge cat, yani depodan dosya çekerken hiçbir şey yapmayın

Notlar:
Elbette bu ruby ​​dosyaları içindir, bir satır ile bittiğinde #gitignoreuygulanır ve global olarak uygulanır ~/.gitconfig. Bunu, amaçlarınız için ihtiyaç duyduğunuz şekilde değiştirin.

Uyarı!!
Bu, çalışma dosyanızı depodan farklı bırakır (elbette). Herhangi bir kontrol veya yeniden ödeme, bu satırların kaybolacağı anlamına gelir! Bu hile işe yaramaz görünebilir çünkü bu satırlar ödeme, yeniden ödeme veya çekme sırasında defalarca kaybolur, ancak bundan yararlanmak için özel bir kullanım durumum var.

Tam git stash save "proj1-debug" filtre etkin değilken (sadece geçici olarak devre dışı bırakın gitconfigveya başka bir şey yapın). Bu şekilde, hata ayıklama kodum her zaman git stash applybu satırların yanlışlıkla işlenmesi korkusu olmadan koduma her zaman eklenebilir .

Bu sorunların üstesinden gelmek için olası bir fikrim var, ancak bunu başka bir zaman uygulamaya çalışacağım.

Git filtreleri ve git özelliklerinden bahsettikleri için Rudi ve jw013'e teşekkürler.


2

İçerik filtresi sürücüsü iyi bir çözüm değildir. Bu satırı git status/ etc'den gizleyebilirsiniz, ancak bu gerçekten göz ardı edilmiyor. Değeri değiştirir değiştirmez, değişiklik görünmese bile çalışma dizininiz kirli olarak işaretlenecektir.

Bu satırın sürüm kontrolünden gerçekten çıkmasını istiyorsanız, onu bir komut satırı bağımsız değişkenine dönüştürmek veya yok sayılmış bir içerme veya derleme dosyasına yerleştirmek tek pratik yol olabilir.


"Değeri değiştirir değiştirmez, çalışma dizininiz, değişiklik görünür olmasa bile kirli olarak işaretlenecektir": temiz komut dosyası, dosyayı orijinal içeriğiyle geri yüklemeye devam ederse, olmamalıdır.
VonC

Ben de öyle düşünmüştüm. GitExtensions kullanıyorum ve diff bölmesi boş olsa bile dosyayı değiştirilmiş olarak gösterecek. Muhtemelen, dosya girişine kadar temiz filtre çalıştırılmadığı için. Muhtemelen msysgit olduğu için, git-git değil. IDK, YMMV
patricktokeeffe

1

Sanırım bu, kaynağınızın birden fazla satırında ortaya çıkan bir şey olabilir.

Sanırım, eklediğiniz ve varsayılanları kontrol ettirdiğiniz bir tür .userbuildconfig dosyasına sahip olmanın en temiz olacağını düşünüyorum. Ardından, bu dosyayı tek başına değiştirilmediğini varsaymak için işaretlemek için Carlos'un önerisini kullanabilirsiniz . Bu şekilde, ayarı kontrol etmeniz gereken dosyadaki diğer değişiklikler gözden kaçmaz.

Bu, önişlemci makrolarını yerel olarak ayarlamanıza izin verebilir (Veya java için bunun gibi https://stackoverflow.com/a/1813873/1270965 ).


-1

Hayır! .Gitignore'daki satırlar dosya adlarıyla eşleşip dosya içeriği ile eşleşmediği için yalnızca tek tek dosyaları (ve daha fazlasını) yoksayabilirsiniz. Bunun çözümünden daha önce bahsetmiştiniz, yani görmezden gelmek istediğiniz içeriği içeren tek bir dosyayı görmezden gelin.


Kabul ediyorum, benim durumumda bu içeriği göz ardı edilmiş bir dosyadan basitçe dahil etmenin yeterli ve mümkün olduğunu. Yani tüm göz ardı edilebilir ayarları değiştiriyoruz. Orada. Ayrıca, göz ardı edilen dosyanın bir kopyasını oluşturdum ve onu referans olarak dizine ekledim, böylece o dosyada ne olacağıyla ilgili bilgiler kaybolmayacak.
Urs
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.