Nokta bağlantılarını bulmak yerine $ HOME'u gitmeye koymanın tuzakları var mı?


38

Uzun yıllar boyunca tüm $HOMEdizini yıkıma aldım . Bu, tüm dotfiles ve uygulama profilleri, birçok senaryo, araç ve hack, tercih ettiğim temel ev dizin yapısını, birkaç tuhaf projeyi ve rastgele verilere değer bir depoyu içermiştir. Bu iyi bir şeydi. Bu süre sürdü.

Ama elimden alındı. Temel ödeme düzinelerce sistemde aynıdır, ancak tüm bu şeyler tüm makinelerim için uygun değil. Hepsi farklı dağıtımlarla güzelce oynamıyor bile.

Ev temizliği sürecindeyim - verileri ait olduğu yere ayırmak, bazı komut dosyalarını ayrı projeler olarak ayırmak, bazı kesilmiş bağlantıları otomatik hale getirilmesi gereken şeyler üzerine sabitlemek vb.

Benim niyet değiştirmektir subversionile gitarasında toplevel ödeme için $HOME, ama ben dotfiles, birkaç dizinleri ve bazı temel özel komut dosyaları anlamı, TÜM benim sistemlerinde sahip olmak istiyorum sadece şeyler bu aşağı pare istiyorum.

Online olarak okurken, birçok kişi bunu sembolik bağlantı yaklaşımını kullanarak yapıyor gibi görünmektedir: bir alt dizine klonlamak, daha sonra $HOMEdepodan sembolik bağlantılar oluşturmak . Gözlerimi vardı sahip $HOMEon yıldan fazla süredir tam sürüm kontrolü altında, ben bu tür yaklaşıma fikri sevmiyorum ve insanların düz çıkış yöntemine yüzden isteksiz görünüyor neden çözemiyorum. İçin gitüst düzey bir ödeme olarak belirli hakkında bilmem gereken tuzaklar var $HOMEmı?

PS Kısmen iyi kodlama alıştırması olarak, kök kontrolümü github'da halka açık hale getirmeyi planlıyorum. İkinci bir düşünce olmadan paylaşılabilir olmaya çalışan dosyalarda güvenlik açısından hassas bilgilerin toplanmasına izin vermem çok korkutucu! WiFi şifresi, şifrelenmemiş RSA anahtarları vb. Eeek!


5
Merak ediyorum ki, $ HOME'un ikinci bir düşünce olmadan paylaşılabilir olması gerektiği inancına yol açıyor. Şifreli RSA özel anahtarlarının bile paylaşılmaması gerekiyor.
derobert,

3
Aslında, ana dizininizin içeriğini git'e koymak hakkında konuşuyorsanız, sadece not edin: Git geçmişini araştırmak ve hassas öğeleri kalıcı olarak dikkatlice kaldırmak (Git şeyler kaybını önlemeye yardımcı olmak için tasarlanmıştır), ve ayrıca, şubeleri değiştirdiğinizde veya satın aldığınızda önceki bir revizyonun git, 644özel ssh anahtarları gibi şeyler için kötü olan ödeme sonrası dosyalarınızın izinlerini değiştireceğini unutmayın . Ancak etckeepervb / izinleri ile budala kullanmak için bir çözümdür /
cwd

@ robert: Bunun farkındayım. $ HOME 'u herkese açık yapmaktan bahsetmiyordum, sadece dotfiles ve rahatlık senaryoları. Bunlar ait olmayan şeyleri bulduğum yer. Ve evet, gözlerimi paylaşmak gerekir .zshrc, .vimrcbenzer şeyler önce onları sterilize etmek zorunda kalmadan ve!
Caleb

4
Eğer görmediyseniz, bkz vcs-ev insanlar tam olarak tartışırken temelde wiki ve e-posta listeleri, bu - revizyon kontrol altında $ HOME tutmak için nasıl.
Jim Paris

Git'in davranışını ne kadar değiştirebildiğini bilmiyorum, ama en azından debian-deposundan çıktığı şekli, izlenen / izlenmeyen / değiştirilen dosyaları aramaya gelince oldukça açgözlü. her dosyadan sorumlu hissediyor. mrb bunu zaten belirtti. Bazen bu açgözlü davranıştan rahatsız ediliyorum, göreceli olarak küçük projelerde bile, ev dizinimde bunu istemem. Neden git kullanmak istiyorsun? Ayrıca yapılandırma dosyalarımı ana bilgisayarlar arasında senkronize etmek için bir sürümleme sistemi kullanıyorum ve CVS'den çok memnunum çünkü çok basit! Git bunun için çok (çok!) Güçlü
Bananguin

Yanıtlar:


17

Evet , gitendişeli olmayan bir ev dizinini yönetmeyi düşünürken en az bir büyük sorun var subversion.

Git, hem açgözlü hem de özyinelemelidir .

Subversion, bilmediği bir şeyi saf olarak görmezden gelecek ve sizin bilmediği (veya farklı bir havuza ait) bir klasöre ulaştığında kasanızdaki klasörleri aşağı veya yukarı işlemeyi durdurur. Diğer taraftan Git, ad alanlarındaki sorunlar nedeniyle yuvalanmış kontrolleri karmaşık hale getirerek tüm alt dizinleri tekrarlamaya devam ediyor. Ana dizininiz muhtemelen aynı zamanda başka git git depolarında ödeme yaptığınız ve çalıştığınız yer olduğundan, gittiğinizde ev dizininizin olması kesinlikle hayatınızı imkansız bir karmaşaya dönüştürecek.

Görünen o ki, insanların nokta dosyalarını izole edilmiş bir klasöre alması ve daha sonra ona bağlaması ana nedenidir. Herhangi bir alt dizinde başka bir şey yaparken, gitmeyi engeller $HOME. Evinizi yıkıma sokmak, bu tamamen tercih meselesi olsa da, git'i kullanmak zorunluluk haline geliyor.

Ancak , alternatif bir çözüm var. Git, tüm depo makinelerinin fiziksel olarak kasa çalışma dizininden ayrılabilen alternatif bir klasörde saklandığı "sahte kök" adlı bir şeye izin verir. Sonuç olarak, git araç setinin kafası karışmayacak: deponuzu bile GÖNDERİLEMEZ, yalnızca çalışan kopya. Birkaç çevre değişkeni ayarlayarak, ana dizininizi yönetirken bu anlar için malları nerede bulacağınız konusunda ipucu alabilirsiniz. Ortam değişkenleri ayarlanmadıysa kimse akıllıca davranmaz ve eviniz klasik dosya-öz gibi gözükür.

Bu hile akışını biraz daha düzgün hale getirmek için dışarıda harika araçlar var. Vcs-ev posta listesi defacto yer başlamanın nasıl görünüyor ve sayfayla ilgili NASIL ve insanların deneyimleri kadar uygun bir şal vardır. Yol boyunca vcsh gibi bazı şık küçük araçlar var , Bay . Ana dizininizi doğrudan git konumunda tutmak istiyorsanız, vcsh neredeyse bir araç olmalıdır. Eğer perde arkasında birkaç repostories bölmeyi ev dizinini sonunda, birleştirmek vcshile mrçabuk ve çok kirli yolu tek seferde yönetmek için.


2
ama neden sadece .gitignore dosyanıza '*' eklemiyorsunuz? Bu şekilde git, depoda bulunan dosyalar dışındaki her şeyi görmezden gelir ve ile yeni dosyalar ekleyebilirsiniz git add -f <file>.
ALiX

@ALiX: Çünkü gitbazı projeler için ayrı bir git repo olan bir alt dizinde olsanız bile , araçlar hala ev dir repo'nuz üzerinde çalışacağınızı düşünecektir. Bu çözüm, tüm ev dizininizin diğer tüm git çalışmaları ile sınırlandırılmasını sağlar.
Caleb,

4
ama .gitignore'nizdeki bir '*', home-dir-reponuzda olmayan tüm dosyaların göz ardı edildiği anlamına gelir. ve bazı alt dizinlerde yeni bir git repoyu kontrol ettiğinizde her şey hala beklendiği gibi çalışmalı (bence). Bildiğim kadarıyla, git araçları dizin hiyerarşisi yukarı hareket ederken ilk .git dizini arayacak. Bu nedenle, alt dizinde çalışırken, doğru git deposu kullanılacaktır. Elbette, git'in ortam değişkenlerini kullanıyorsanız, her şeyin karışıklığa yol açabileceğini tahmin ediyorum. Ama aksi halde, bunun neden işe yaramayacağını anlamıyorum.
ALiX

@ALiX haklı. İç içe git repoları, üst repo'da gitmiş olduğunuz sürece iyi çalışıyor gibi görünür. Git'in çevre değişkenleriyle ilgili olası sorunların yanı sıra bu çok basit yaklaşımın dezavantajları nelerdir merak ediyorum.
evanrmurphy

1
Bugün bunu deniyordum. Bence /*daha iyi çalışıyor *çünkü hala varsayılan olarak her şeyi göz ardı ediyor ama dizin eklemeyi çok kolaylaştırıyor. Yerine git add -fben kullanıyorum !gibi -prefixed desenleri !/.vimrcve !/.gitignore(.gitignore dosyasının kendisini için) için açıkça repo şeyleri içerir.
evanrmurphy

14

Bütün ev dizininin sürüm kontrolünü kontrol etmesini istemem çünkü bunun anlamı, girdiğim her alt dizinin giriş dizimin sürüm kontrol içeriğine sahip olmasıdır. Gibi komutlar git checkoutbu durumda fiili bir eylemde bulunacak, yanlışlıkla yanlış bir dizinden bir şey çalıştırabilirsem, bir şeyin gitkendisinin mi yoksa git'i çağıran bir komut dosyası mı olacağı konusunda sorunlara neden olabilir .

Ayrıca istemediğiniz bir şeyi, istemediğiniz bir şeyi eklemenizi daha da kolaylaştırır; bu da her şeyi kontrol ettirdiğinizde sorun olmazdı, ancak şimdi bir sorun haline geldi. Yanlışlıkla özel bir anahtar dosyası (belki de alışkanlık dışı) ekleyip github'a zorlarsanız ne olur?

Bunu söyledikten sonra, birincil dezavantajların gerçekten teknik olmadığını düşünüyorum - sadece beni kendimden kurtarmak istemiştim.

Sembolik bağlantı için: Repo'nuzu bir alt dizine klonlayabilir ve güncellenmesi gereken sembolik linkleri güncelleyen bir komut dosyasına sahip olabilirsiniz. Yine de, bu senaryo için gereken bakım miktarı, sahip olmanın faydalarından ağır basabilir; sembolik bağlantı daha az işe dönüşebilir.

Sembolik bağlantılar ile, git kontrol etmek için kolayca dağıtıma özgü (veya hatta sunucuya özgü) eklemeler de yapabilirsiniz. Symlink güncelleme komut dosyası, uyumsuz platformlar veya farklı ana bilgisayarlar için tasarlanan dosyaları yok sayar ve yalnızca uygun olanları günceller.

Gibi bir şey:

HOMEREPO=$HOME/homerepo
HOST=$(hostname)
UNAME=$(uname)

for dotfile in $HOMEREPO/shared/* $HOMEREPO/host-$HOST/* $HOMEREPO/uname-$UNAME/*
do
    target=$HOME/$(basename $dotfile)
    [ ! -r $target ] && ln -s $dotfile $target
done

Şahsen: Ben sembolik bağlantılar kullanıyorum ve dizin linkleri eklemiyorum; sadece içindeki dosyalar. Bu bana bu dizinlerde yerel-site değişiklikleri yapma konusunda biraz esneklik sağlıyor (ör. Dosya ekle / kaldır). Hesabımı yeni bir sistemde kurmak çok sıkıcı çünkü tüm sembolik bağları elle yeniden yaratmalıyım.


gitÇalıştırdığım herhangi bir komut, ya ana dizinin kendisi için olacak ya da NON görevlendirilmiş bir dizinde en az bir derinlikte gömülecekti. Kullanımı svnbu bir klasör izolasyonu oldukça etkilidir ve bana bir on yıl içinde herhangi bir sıkıntı kaynağı olmamıştır. İlk paragrafınız başka bir şeyi gösterir. Bu gerçekten çalışma şeklindeki bir fark gitmı?
Caleb

Ayrıca benim yapılandırmalarım ve komut dosyalarım zaten yerleşik olan farklı ana bilgisayarlar ve platformlar için koşullu mantığa sahip, bu nedenle koşullu olarak farklı bağlantılar kurmak için bir komut dosyası kullanmak gitdalları yönetmenin kolay bir kazancına benzemiyor . Hala bir şey eksik veya bu tercihinize inecek mi?
Caleb,

3
Bir klasör yalıtımı gerçekten yalıtılmaz git- emin değil svn- ancak bir örnek olarak git init foo && mkdir -p foo/bar/baz/spam && cd foo/bar/baz/spam && git status(veya diğer git komutları) hala foosürüm kontrol bağlamında olduğunuzu gösterir.
mrb

Yapılandırma ve komut dosyaları: Bütün dotfiles koşullamaları desteklemez, bu yüzden alternatif yaklaşımı önerdim. Bunların hepsi, insanların sürüm kontrolünü kullanmayı tercih etmemesinin nedenleri $HOME- ve sürümleme, dotfiles imo için gerçekten değerli değil - ama sonuçta ana dizininizdir, bu yüzden git kullanmayı tercih ederseniz ve bunlar sizin için sorun olmazsa, Göreyim seni!
mrb

Bilgi için teşekkürler. Aslında git hakkındaki izolasyona izin vermeme konusundaki yorumunuz en kullanışlı bit. Cevabınıza belirgin bir şekilde çalışabilirsiniz. Yıkılma bu noktada çok farklı davranır ve bu kullanım durumu için önemlidir.
Caleb

5

Başka bir bakış açısı vermek gerekirse: Bir zamandan beri $ HOME'umu gitmekteyim ve herhangi bir dezavantaj bulamadım. Açıkçası bu git repo'yu github ile senkronize etmiyorum; Özel depoları olan bir servis kullanıyorum. Ayrıca git kontrol altına hiçbir medya dosyası, indirme veya paket koymuyorum.

  • git status kontrol listesi "yapmak, temizlemek" türüdür.

  • ~/tmpGitignored bir geçici şeyler için var .

  • git statusYeni yüklenen bir yazılımın $ HOME'uma eklemeye cesaret edebileceği ve bu dosyaları sık sık sildiği ya da suçluları kaldıran herhangi bir şeyi görmeyi seviyorum .

  • .gitignore'Bir şeyi yüklerken ne yaptığını bil' yararına sahip olan gerçekten yararlı yerel dosyaları ve dizinleri elle eklerim .

  • Yeni bir VM kurarsam ya da yeni bir PC kurarsam, uzaktaki evimi $ HOME'a klonlarım ve ellerimin altında ihtiyacım olan her şeye sahibim.

  • Vim eklentileri için vundle gibi şeyler artık gerekli değildir.

Karmaşıklığı sevmiyorum. Herhangi bir rc dosyasını çimdiklediğimde, sadece yapıyorum, itiraz ediyorum ve itiyorum. Daha sonra, bir refleks olarak, her gün $ HOME'a giriyorum ve her zaman en son konfigürasyona sahibim. Bu kadar basit.

Şu anda bu rejimde olan makineler: Ev dizüstü bilgisayarı, çalışma bilgisayarı, çalışma VM'si, artı 3 veya 4 uzak sunucu.


Evinizin içine yerleştirilmiş başka git check-out'ınız var mı?
Caleb

Hayır, başka şeyleri bir / work dizinine koyar ve vim pugins gibi küçük araçları klonlamaz.
gb.

1
~ / Sites içinde çalışıyorum ve bu yaklaşımı da yapıyorum, iç içe git
reposuyla bir

1
Bu kurulumu bir süredir kullanıyorum. Bir 'alias sq = git status -uno' var ve .gitignore ile fazla uğraşmadım (sık sık tüm hamlelere bakıp "meh" derim). Yuvalanmış git repolarıyla hiçbir zaman sorun yaşamadım Özel bir sunucum var, burada git init --baressh'yi zorluyorum (depoya şifre koymasam da not dosyalarım var).
utanmaz

5

Her ikisini de denedim ve sonuçta sembolik bağlantı yaklaşımını tercih ettim :

  • Her yere göz atın
  • make install
  • X ayarlarını yüklemek için oturumu kapatıp tekrar açın

Dezavantajları:

  • Zorunda dosya taşımak eklemeden önce repoya
  • Sürdürmek zorunda sembolik bağlantıların listesi Makefiledaki

Avantajları:

  • Çok büyük bir ihtiyaç yok .gitignore( ~benim mütevazi Ubuntu kutumda 133 nokta dosyası var )
  • Can bakım komut dosyalarını tutmak ve diğer ~lı şeyler (örneğin Makefileve cleanup.sh) dışına
  • Sürüm kişisel ve genel ayarları ayrı ayrı kontrol edebilir

Kısıtlamalar:

  • @Mrb'den farklı olarak sadece içinde sembolik bağlantılar oluşturuyorum ~. Bu, bağlantıyı basit tutar ve örneğin ~/.vim, çok nadir bir .gitignorebakımın maliyeti nedeniyle yeni dosyaları fark etmeyi önemsiz kılar .

Bu son iki avantaj, benim durumumda teraziyi ortaya koydu - ana dizini karıştırmak istemiyorum ve özel ve genel içerikleri açıkça ayırmak istiyorum.

Symlinks ile ilgilenmekte olan (veya en azından) problemleri olduğunu bildiğim tek uygulama Pidgin'di.


Profesyonellerin ve her bir yaklaşımın eksilerini girdiğiniz için teşekkür ederiz. İzlememde , başlamak için ekstra kablo tesisatı kurmayı tamamladığınızda her iki dünyanın da en iyisini sağlayabilecek üçüncü bir yaklaşım olduğunu keşfettim .
Caleb,

3

Birincisi: Yapmaya çalışırsanız ve depodaki ilk işleme girdikten sonra git rebase -i --rootteslim aldıysanız .gitconfig, git .gitconfigdosyayı geçici olarak kaldıracak, bu da adınızı ve e-postanızın yapmasını gerektirdiğinden yeniden yükleme işlemini tamamlayamamasını sağlayacaktır. Bu, o dosyada saklanır.

Onları tekrar yapılandırabilir ve yapabilirsiniz git rebase --continue, ancak bunu yaptıktan ve yeniden yapılanma işlemini tamamladıktan sonra git depom, daha önce depoda ilk yaptığım ve daha önce bilmediğim bir taahhüd mesajı olmadan boş bir taahhüt aldı. kurtulmak için nasıl.

Bunu yaparsanız ne olacağını bilmiyorum git rebase -i <commit>ve .gitconfigsonra herhangi bir taahhüt ile birlikte kontrol edilir <commit>.

Belki de en kolay çözüm, .gitconfigdepoya eklemekten kaçınmak ve bunun yerine listelemektir .gitignore.


2

Bu nasıl yaparım:

  1. temiz bir linux kurun (gerekli değildir ancak 4. adımda hayatı daha keyifli hale getirir)
  2. etckeeper yüklemek
  3. git initevinde koş
  4. .gitignore oluşturun ve ilginizi çekmeyen veya çok fazla değişebilecek gibi görünen her şeyi ekleyin. Gibi şeyler eklemeyi unutmayın olun *.cache, *.lockekleme önermiyoruz vb ben/*çünkü evinize yeni bir şey eklendiğinde otomatik olarak bilgilendirilmeyeceksiniz. Temelde uçucu şeyler ve umursamadığım bazı yazılımlar dışındaki tüm yazılımlar için yapılandırmamı saklamak istediğim kara liste yaklaşımıyla beyaz liste yaklaşımıdır. Daha sonra birleştirme, taşıma veya sistemleri karşılaştırma, her şeyi ayırt edebilmek oldukça kullanışlıdır. Yeni sistemlerinizi, sadece .bashrc ve birkaç diğer nokta dosyasına sahip olmanızdan çok daha hızlı ayarlayabilirsiniz. Bu şekilde, GUI aracılığıyla başka şekilde ayarlayabileceğiniz ve hangi nokta dosyalarının ayarları kaydettiğinin farkında olmayacağınız yapılandırmayı koruyacaksınız. (Uçucu dosya işlediğiniz ortaya çıkarsa, hala git-değiştirmeden varsayımını söyleyebilirsiniz)
  5. Çalıştırmak etckeeper init -d /home/username
  6. Çalıştırmak git commit -d /home/username
  7. komut satırını daha iyi hale getirmek için kabuğunuzda takma adlar ayarlayın, homekeeper checkout

Etckeeper'ı kullanmanın nedeni, dosyalarınız için meta veri benzeri izinler (ssh tuşları gibi bazı şeyler için önemli) depolamasıdır. Artık meta verileri otomatik olarak kurtaracak ön işleme kancasına sahip olmalısınız. Ödeme sonrası hakkında pek emin değilim. Muhtemelen kullanmalısın etckeeper checkout xxx -d /home/user, biraz daha araştıracağım ve bu cevabı açıklayacağım.


-1

Git'i ev dizininde kullanmakla ilgili temel sorunum Git'in dosya izinleri ve zaman damgaları gibi dosya özniteliklerini kaydetmemesidir. Benim için, belirli dosyaların ne zaman oluşturulduğunu bilmek önemlidir, bunun sizin için uygun olup olmadığını. Ayrıca, dosya ve dizinler üzerindeki izinleri kaybetmek .sshproblemlidir. .sshGit'ten uzak durmayı planladığınızı anlıyorum , ancak izinlerin önemli olabileceği başka yerler de olacak (sıkıştırılmamış web sitesi yedeklemeleri gibi).


Bu aslında yanlış değilse yanıltıcıdır. Git varsayılan olarak izinler dahil birçok dosya özelliğini korur. Bir süredir .sshsorunum olmadan gitmekteyim, uygun güvenlik izinleri korunuyor. Temel yapılandırmada yapmadığı şey mülkiyeti veya zaman damgasını korumaktır; Ancak, bunlardan herhangi biri, belirli bir kullanım durumu için bir sorunsa, bu ek özelliklerin kullanımını normal iş akışının bir parçası haline getirebilecek eklentiler var (bkz. metastore veya git-cache-meta).
Caleb

Onları saklamamasına rağmen, vcs'de değil, sadece bir ev dizini olmaktan daha kötü bir şey var mı? Bir dosyayı değiştirmenizi istemediğiniz sürece git aktif olarak mtimes üzerine yazmaz.
poolie

-1

Git tabanlı bir çözüm, dosyalarınızı farklı makinelere dağıtmanız gerekiyorsa ve dahası, tüm makinelerde ortak olan bölümlere ve bazı makinelere özgü olan bölümlere sahipseniz özellikle kullanışlıdır. Birden fazla depo oluşturabilir ve aynı dizine (bu durumda ana diziniz ) klonlamak için multigit veya vcsh gibi bir araç kullanabilirsiniz .


Teşekkürler, ama belki soruyu kaçırdın. Bunun kullanımının farkındayım (bu yüzden neden ilk etapta yapmak istedim), bu soru git ile bunu yapmak için yeni birisinin (sorduğumda olduğum gibi) farkında olamayacağı konusundaydı. . Bu soruya hiç cevap vermiyor gibi görünüyor.
Caleb
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.