Git boşluklar ve sekmeler arasında otomatik olarak geçiş yapabilir mi?


196

Python programımda girinti için sekmeler kullanıyorum, ancak bunun yerine boşluk kullanan kişilerle işbirliği yapmak istiyorum.

Git'in itme / getirme sırasında boşluklar ve sekmeler (örneğin, 4 boşluk = 1 sekme) arasında otomatik olarak dönüşmesinin bir yolu var mı? (CR / LF dönüşümüne benzer)


33
PEP8 benim sorunum. Herkes onu takip ediyor ve sekmelerimle takılı kalıyorum. Bunu düşünmek başına bir girinti = bir sekme yapılacak doğru şey (neden boşluklar? 4 alanlarda? PEP8 o açıklamıyor neden ...). Her neyse, bu git hilesi ile mutlu bir şekilde bilgisayarımdaki sekmeleri kullanabilir ve kodumu tüm PEP8 takipçileriyle paylaşabilirim.
Olivier Verdier

7
Ah! TextMate kullanıyorum ve boşluklar arasında sekmelere dönüştürebiliyorum. Mesele şu ki, sekmeye bastığımda editörümün ... sekmesini yazmasını istiyorum. Bu yüzden boşluklu bir python projesi satın alırsam, her türlü sekmeyi ekleyeceğim. Manuel olarak sekmelere dönüştürmeliyim, ancak check-in yaptığımda 1000 silme, 1000 ekleme gibi görünüyor ve ortak çalışanlarım mutlu olmayacak. :-)
Olivier Verdier

6
PEP8'in sekmeler yerine boşluk belirtmesinin nedeni devam eden girinti kurallarıdır. Parantez içinde uzun bir çizgiye devam etmenin iki yolu vardır. Parantezden hemen sonra yeni bir satıra başlarsanız, yalnızca bir girintiyi girersiniz. Bunun yerine parantez içeriğinin bir kısmını ilk satıra koyarsanız, parantezin bir sonraki satırında açılış parantezinin girinti düzeyinde devam etmesi gerekir. Çalışmayan sekmeler kullanıyorsanız.
John Christopher Jones

2
@JohnChristopherJones bu durumda, önceki satırla girintiyi eşleştirmek için sekmeleri, ardından önceki satırdaki bir konumla eşleştirmek için boşlukları kullanabilir. Bu kolayca boşluklara dönüştürülebilir. Ne yazık ki bunun tersi doğru değildir, çünkü girinti bilgisini hizalama bilgileri ile karıştırır.
Patrick Parker

Yanıtlar:


196

İşte tam çözüm:

Deponuza .git/info/attributesaşağıdakileri içeren bir dosya ekleyin :

*.py  filter=tabspace

Linux / Unix

Şimdi komutları çalıştırın:

git config --global filter.tabspace.smudge 'unexpand --tabs=4 --first-only'
git config --global filter.tabspace.clean 'expand --tabs=4 --initial'

OS X

İlk demleme ile coreutils yükleyin:

brew install coreutils

Şimdi komutları çalıştırın:

git config --global filter.tabspace.smudge 'gunexpand --tabs=4 --first-only'
git config --global filter.tabspace.clean 'gexpand --tabs=4 --initial'

Tüm sistemler

Şimdi projenizin tüm dosyalarını kontrol edebilirsiniz. Bunu aşağıdakilerle yapabilirsiniz:

git checkout HEAD -- **

ve artık tüm python dosyalarında boşluk yerine sekmeler bulunur.

Düzenle : zorunlu ödeme komutunu değiştirdi. Tabii ki önce işinizi yapmalısınız.


1
Temiz filtre benim için çalışmıyor. Git yaptığımda ekle. "Hata: harici filtre genişletme --tabs = 4 - başlangıç ​​başarısız" diyerek bir hata alıyorum. Windows'dayım. Bu bir fark yaratır mı?
Jeremy Hicks

2
@Jeremy: genişlet / aç genişlet unix komutlarıdır. Windows bağlantı noktalarını / eşdeğerlerini bulmanız veya Cygwin
Tim


3
@ Marc-André İyi bir nokta. Aslında coreutils sürümlerini kullanıyorum. (Yükle homebrewve çalıştır brew install coreutils).
Olivier Verdier

2
Görünüşe göre bu artık çalışmıyor, filtreler benim için hiçbir şey yapmıyor. Ödeme yapıldıktan sonra dosyalar hala boşluk içeriyor. herhangi bir güncelleme var mı_
Philipp Ludwig

141

Evet, potansiyel bir çözüm bulaşma / temizleme mekanizması tanımlamak için git özniteliği filtre sürücüsü kullanmaktır (ayrıca GitPro kitabına bakın ).

alternatif metin

Bu şekilde:

  • deponuzdaki bazı dosyaları her teslim aldığınızda, boşluklar sekmelere dönüştürülebilir,
  • ancak check-in yaptığınızda (ve aktarıp yayınladığınızda), aynı dosyalar yalnızca boşluklar kullanılarak geri kaydedilir.

Bu filtre sürücüsünü (burada ' tabspace' olarak adlandırılır ) .git/info/attributes(Git deposundaki tüm dosyalara uygulanan bir filtre için) ve aşağıdaki içerikle bildirebilirsiniz:

*.py  filter=tabspace

Şimdi komutları çalıştırın:

# local config for the current repo
git config filter.tabspace.smudge 'script_to_make_tabs'
git config filter.tabspace.clean 'script_to_make_spaces'

Bkz Olivier 'in cevabı böyle bir leke / talimatların temiz kümesinin bir beton çalışma örneğin.


Ne yazık ki, işe yaramıyor. Tüm talimatları izledim, ama git fiteri uygulamıyor. :-( Ödeme yaptığımda, bulaşma filtresi uygulanmadı ve kontrol ettiğimde hiçbir şey olmuyor ... git bazen çok sinir bozucu ...
Olivier Verdier

@Olivier: Garip, ödeme / kontrol işlemini yavaşlatmamak için özellik filtresinin kapsamını (yalnızca belirli bir alt ağaç için belirli bir alt ağaçla) dikkatlice sınırladığım sürece, bu konuda hiç sorun yaşamadım. devam ediyor. Örneğin bkz. Stackoverflow.com/questions/62264/…
VonC

Teşekkürler! Şimdi çalışıyor. Komple çözümü görün: stackoverflow.com/questions/2316677/…
Olivier Verdier

@Vonc: belki biri --globalbayrağı kaldırmalı , çünkü bu her işbirliği projesine boşluklar gönderiyorsunuz ...
Willem Van Onsem

@CommuSoft sadece hakkı olan projelere .gitattributes. Ancak evet, yapılandırmanın repo için yerel tutulup tutulmadığını anlamak daha kolaydır. Cevabı düzenledim.
VonC

39

GitHub (veya benzeri bir hizmeti) kullanan herkes için çok yararlı bilgiler

~/.gitconfig

[filter "tabspace"]
    smudge = unexpand --tabs=4 --first-only
    clean = expand --tabs=4 --initial
[filter "tabspace2"]
    smudge = unexpand --tabs=2 --first-only
    clean = expand --tabs=2 --initial

Sonra iki dosyam var: attributes

*.js  filter=tabspace
*.html  filter=tabspace
*.css  filter=tabspace
*.json  filter=tabspace

ve attributes2

*.js  filter=tabspace2
*.html  filter=tabspace2
*.css  filter=tabspace2
*.json  filter=tabspace2

Kişisel projeler üzerinde çalışma

mkdir project
cd project
git init
cp ~/path/to/attributes .git/info/

Bu şekilde, sonunda çalışmanızı github'a aktardığınızda, 8 space tabstüm tarayıcılarda varsayılan davranış olan kod görünümünde saçma görünmez .

Diğer projelere katkıda bulunmak

mkdir project
cd project
git init
cp ~/path/to/attributes2 .git/info/attributes
git remote add origin git@github.com:some/repo.git
git pull origin branch

Bu şekilde 2 space indentedprojelerde normal sekmelerle çalışabilirsiniz .

Tabii ki dönüştürmek için benzer bir çözüm yazabilirsiniz 4 space to 2 space, benim tarafımdan yayınlanan projelere katkıda bulunmak istiyorsanız ve gelişirken 2 boşluk kullanmaya eğilimlisiniz.


2
İlgili: Git config havuzunun bir parçası olarak saklanır ; ayrıca .gitattributesrepo dosyasında bir dosya kullanabileceğinizi (ve uygulayabileceğinizi) unutmayın
Tobias Kienzler

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.