Kaynak kontrolü altına almak için ipuçları


77

Ana dizini (~) kaynak denetimine koymak istiyorum (git, bu durumda, git), çünkü orada birçok ayar dosyam (.gitconfig, .gitignore, .emacs, vb.) Makineler arasında taşımak istiyorum. ve Git’te onları bulundurmak onları almak için iyi olur.

Ana makinem MacBook'um ve OS X'in ayarlandığı şekilde, göz ardı etmek istediğim birçok klasör var (Documents, Downloads, .ssh). Zaten Git (.emacs.d) kullanan klasörler de var.

Benim düşüncem, tüm bu dizinleri .gitignore dosyama eklemek oldu, ama bu biraz yorucu görünüyor ve potansiyel olarak öngörülemeyen sonuçlara yol açabiliyordu. Bir sonraki düşüncem, depolamak istediğim dosyaları düzenli aralıklarla evdeki bir klasöre kopyalamak ve sonra bu klasörü işlemek oldu. Bununla ilgili sorun, taahhüt etmeden önce onları taşımayı hatırlamam gerekecek.

Bunu yapmanın temiz bir yolu var mı?


İstediğiniz klasörlerin işlemlerini yaparak cronjobs aracılığıyla çağırarak bir betik hazırlayabilirsiniz.
Shadok

Mac OS X'teki varsayılan HFS + dosya sisteminin büyük / küçük harfe duyarsız (ancak büyük / küçük harf koruyuculu) olduğunu ve dosya yollarının kanonik olarak ayrıştırılmış UTF-8 kullanıcı alanında kodlanmış olduğunu unutmayın! Daha fazla bilgi için bkz. <a href=" stackoverflow.com/questions/5581857/… ve Mac OS X</a> üzerindeki Umlaut sorunu

Yanıtlar:


60

Ben $HOMEGit altında. .Gitignore dosyamın ilk satırı:

/*

Gerisi !değiştirici kullanılarak göz ardı edilmeyen kalıplardır . Bu ilk satır, varsayılan değerin giriş dizinimdeki tüm dosyaları yoksayması anlamına gelir. Kontrol etmek istediğim dosyalar şu şekilde gider .gitignore:

!/.gitignore
!/.profile
[...]

Sahip olduğum daha zor bir örnek:

!/.ssh
/.ssh/*
!/.ssh/config

Yani, sadece sürüm istiyorum .ssh/config- Anahtarlarımın ve .ssh içindeki diğer dosyaların gitmesini istemiyorum. Yukarıdaki, bunu nasıl elde ettiğim.

Düzenleme: Tüm yolların başlaması için eğik çizgi eklendi. Bu, yok sayma kalıplarını, herhangi bir yer yerine deponun üst kısmından ($ HOME) eşleştirir. Örneğin !lib/, bir model olsaydı (lib dizinindeki her şeyi yoksaymayın) ve bir dosya eklerseniz .gitignore, önceki desen ( !.gitignore) bununla eşleşiyordu. Baştaki eğik çizgiyle ( !/.gitignore), yalnızca giriş dizinimde eşleşir .gitignore, alt dizinlerde değil.

Bunun görmezden listem ile pratik bir fark yarattığı bir durum görmedim, ancak bana teknik olarak daha doğru görünüyor.


1
Bana öyle geliyor ki aynı şey çok daha kolay bir şekilde başarılabilir .
Nick Volynkin 15:15

24

Yaptığım şey (aynı amaçlarla), yapılandırma dosyalarımı bir alt dizine koymak ~/libve giriş dizinimde sembolik bağlar kurmak , örneğin .emacs -> lib/emacs/dot.emacs. Yalnızca sürüm kontrolü altında açıkça yazdığım yapılandırma dosyalarını saklıyorum; Ana dizimde sürüm kontrolü altında olmayan ve otomatik olarak oluşturulan nokta dosyaları bulunur. Bu ~/libyüzden sürüm kontrolü altında ve benim ana dizinde değil.

Altındaki dosyalardan sembolik bağlar oluşturan bir betiğim var ~/lib. Yeni bir makinede bir hesap oluşturduğumda, ~/libo betiği kontrol edip çalıştırarak dolduruyorum.

Benim deneyimim CVS'de değil git, yani% 100 devredilemez. Ana dizini doğrudan CVS'nin altına koymama nedenlerimden biri, ~/.cvsignoreyalnızca ana dizini değil tüm CVS ödemelerime uygulanacak olması; git bu sorunu yaşamıyor. Bu dizinin dezavantajı, ev dizininin sürüm kontrolü altında olmasına kıyasla, git statusaçıkça göz ardı etmeye karar verdiğiniz bir dosyayı (yok sayılan dosyada listelenir, bu nedenle görüntülenmez) ile ayırt etmek için kullanamamanızdır . hakkında hiçbir fikriniz olmayan (a ile gösterilecek olan ?) dosya .

Bazı dosyaların farklı makinelerde farklı olması gerekir. Onları denilen bir dizine koydum ~/Local/SITENAME/libve ya onlar için sembolik bağlantılar oluşturdum ya da (onu destekleyen dosya formatları için) altındaki dosyada bir yönerge var ~/lib. Benim de sembolik bir bağlantım var ~/Here -> ~/Local/SITENAME. Git, CVS'in tersine, çoğunlukla benzer fakat özdeş olmayan depoları desteklemek için tasarlandığından, makineye özgü dosyaları yönetmenin daha iyi bir yolu olabilir. Benim nokta olan birkaç dosya aslında sembolik değil bağlantı vardır, ancak otomatik altında içeriğinden yaratılmış ~/libve ~/Here.


Belki de core.excludesfile = 'e sahipsiniz~/.gitignore . Böyle bir yapılandırma olmadan, dosya, içinde depolananlar dışında hiçbir depoya uygulanmaz ~/.git(o zaman bile alt depolara uygulanmaz). Kullandığım core.excludesfile = ~/.git-user-excludesI (konumdan bağımsız) tüm Git depolarına uygulanan istediğiniz dışlar ve ben (bölümlerini) benim ev dizini tutan depo uygulanmasını istediğiniz dışlamalarınızın arasındaki çatışmayı önlemek için.
Chris Johnsen

@ Chris: Git hakkında çok az şey biliyorum. gitignoreMan sayfasındaki bu cümleyi yanlış anlamış olabilirim : “Yol ile aynı dizinde veya bir ana dizinde (…) .gitignore dosyasından okunan desenler (…)” Aslında ödemenin kökünde durur mu (yani nerede? .gitdizin) nedir?
Gilles

1
Evet, .gitignoredosyaları yukarı doğru aramak , çalışma ağacının kökü ile sınırlandırılmıştır. Aldığınız cümle devam ediyor: “(çalışma ağacının üst seviyesine kadar)”.
Chris Johnsen

@Chris: man sayfasının versiyonunda bu kelimeler yok - ifadeler açıklığa kavuşturulmuş gibi görünüyor. Cevabımı düzelttim. Teşekkürler!
Gilles


11

Git'in listelenmiş olsalar bile izlemeye devam etmek için yeteneğini kullanabiliriz .gitignore. Yani, bu için yeter .gitignore:

$ cat .gitignore
/*

İzlemek istediğiniz her dosya için, koşmak add -f( -fhem görmezden parametre geçersiz kılmaları .gitignoreve .git/info/exclude):

git add -f .gitignore
git add -f .profile
git add -f .zshrc
git add -f .ssh/config

Bir dosyayı dizine ekledikten sonra Git, dosyanın göz ardı edilmesine rağmen tüm değişiklikleri izler. Aynı şey bir dizin için çalışır, ancak yalnızca gerçekten mevcut olan dosyalar için

git add -f somedirname

Dizinin içinde görünen tüm yeni dosyaların bulunduğu bir dizini izlemek isterseniz .gitignore, cevabında camh ile açıklanan şekilde dışlanabilir :

!/somedirname

Bir dosyayı izlemeyi bırakmak istemiyorsanız, bu komut Git'in dizininden bir dosyayı siler ancak sabit sürücüye dokunmadan bırakır:

git rm --cached .ssh/config

1
Eğer yapabilseydim sana puanlarımı verirdim. Bu yöntemin sadece dizinleri değil dosyaları izlemek için kullanılabileceği belirtilmelidir. Git bir dizindeki tüm dosyaları izlemek istiyorsanız, hala o dizini .gitignore de görmezden gelmeniz gerekir. Aksi takdirde, bu dizindeki yeni dosyalar yeni dosyalar olarak görünmez.
camh

5

Bunun için eskisini kullanıyorum rcs.

İçin Man sayfalarından göz at ci, cove rcs. Bu siteler de yardımcı olacaktır:

Örneğin, dotfiles'imi kontrol etmek için versiyon kullanıyorum:

ci -u .*vimrc

Ve onları düzenlemek istersem:

co -l .*vimrc

Sizin RCSadınıza bir dizin hazırlamanızı öneririm ~, daha sonra kolayca bir yere bu dizini yedekleyebilirsiniz.


2
rcs şimdi oldukça tarihlendi ve git rcs'nin yaptığı her şeyi ve daha fazlasını yapıyor. Bir sunucuda depo kurmak için ek yükü istemediğim yerlerde yerel bir şey için rcs kullanıyordum, ancak şimdi bu tür bir kullanım için tamamen gitmeye başladım. Cvs2git'i içinde rcs dosyaları olan mevcut bir dizin hiyerarşisini gitmeye dönüştüren bir betik bile yazdım.
Neil Mayhew

1
Evet, tarihli olduğunu biliyorum. Soru, bunun nasıl yapılacağı hakkında bir ipucu içindi. Bu adama uzun yıllar boyunca nasıl yaptığımı söyledim ("tarihli", ipucu, ipucu). Bunu yapmanın tek makul yolu bu değildi.
polemon

5

Config dosyalarımı $HOME/.conf/bir BitBucket Mercurial deposundan kontrol ediyorum . Bir GitHub deposu da aynı şekilde işe yarar.

~/.confÇıkış yapılandırma dosyaları ve sembolik doldurmak için bir kabuk komut dosyası içeren $HOMEher dosya için ~/.conf. (Kazandırma destek yapılandırma biçimleri için .bashrc, .inputrc, .vimrcvs.) Ben dahil ~/.confyerel geçersiz kılmaları yapmak, böylece, o dosyayı ziyade linki.

Bazı config dosyaları için Dropbox klasörümdeki bir dosyaya bağlanıyorum ve dropbox ile paylaşıyorum.

Bazı aylar boyunca $HOMEsürüm kontrolünde kalmaya çalıştım , ancak büyük yoksayma listelerini yönetmekten bıktım, uygulamalar çalıştırarak yapılan yapılandırma değişikliklerini kontrol etmekten yoruldum ve sonuç başka bir bilgisayarda kontrol etmek isteyeceğim bir şey değildi. Masaüstü uygulamalarının farklı sürümleri için çakışmaları düzeltmeyi ~/.gconfya ~/.config/monitors.xmlda ya da ikram etmeyi hayal edebiliyor musunuz?

Kişisel olarak özelleştirdiğim ve makineler arasında genel varsayılanlar olarak paylaşmak istediğim sınırlı bir yapılandırma dosyası listesine bağlanmayı ya da eklemeyi daha kolay buluyorum.



1

Kaynak kontrol altında ilgili olmayan bir klasör olması ikinci vuruş iyi.

Sadece orada 2 kabuk komut dosyası ekleyin. Biri kontrolünüz altında olan dosyaları kopyalamak ~ve diğerini dosyaları toplamak ~ve kaynak kontrollü klasöre geri kopyalamak ve taahhüt etmek için.


0

İşte yeni bir makine kurmak için kullandığım küçük bir yakut betiği

#!/usr/bin/env ruby
# setup.rb

#list of dirs which you don't want to symlink
ignored = %w(.gitignore .gitmodules misc setup.rb readme)

current_dir = File.expand_path(Dir.pwd)
home_dir = File.expand_path("~")

links = `git ls-tree --name-only HEAD`.lines.map(&:strip).select {|x| !ignored.include?(x)  }

links.each do |link|
  link = File.join(current_dir, link)
  symlink = File.join(home_dir, File.basename(link))
  `ln -ns #{link} #{symlink}`
end
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.