Git Windows Sembolik
Sorun: Bizim geliştiricilerin Windows ve Unıx tabanlı işletim sisteminin bir karışımı kullanın. Bu nedenle, sembolik Unıx makinelerde oluşturulan Windows geliştiriciler için bir sorun haline. Windows (msysgit), sembolik işaret dosyaya bir yol ile bir metin dosyasına dönüştürülür. Bunun yerine, gerçek bir Windows sembolik sembolik link haline dönüştürmek istiyorum.
(güncellendibu ben çözümdür:
- Özyinelemeli olarak "sembolik" metin dosyaları. bu post-çıkış komut dosyası yazma
- Kukla gibi aynı isim ve uzantı ile windows sembolik link (mklink kullanarak) ile"" . sembolik link yerine
- Bu windows sembolik bir giriş ekleyerek görmezden .git/info/hariç
Bu hayata değil, ama bu sorun için sağlam bir yaklaşım olduğuna inanıyorum.
Size sorum şu:
- Eğer varsa, ne olumsuzlukları bu yaklaşım görüyor musunuz?
- Bu yazı-ödeme senaryoyu bile uygulanabilir mi? yani ben özyinelemeli olarak kukla bulun "sembolik" dosyaları oluşturur gıt?
- Kimse zaten böyle bir senaryo üzerinde çalıştı? =)
Çok teşekkürler!
CEVAP
Bir süre önce aynı soruyu soruyor (burada, sadece genel olarak değil) ben ve OP önerme çok benzer bir çözüm ile geliyor sona erdi. İlk sorulara direkt cevaplar vermek veririm 1 2 & 3 ve yukarı kullandım çözüm göndeririz.
- Gerçekten de önerilen çözüm, esas olarak depo kirliliği için artan bir potansiyel ile ilgili birkaç olumsuzlukları vardır, ya da yanlışlıkla kendi içinde yaparken dosyaları "Windows" diyor. sembolik yinelenen ekleme ("Kısıtlamalar" aşağıda.) altında bu konuda daha fazla
- Evet, post-çıkış için bir komut uygulanabilir. Sonrası
git checkout
adım sabit değer olarak değil belki, ama çözüm aşağıda post-çıkış komut değişmezi gerek yoktu o kadar iyi benim ihtiyaçlarını bir araya geldi. - Evet!
Çözüm:
Bizim geliştiricilerin çok aynı durum olarak OP: bir karışım Windows ve Unıx tabanlı bilgisayarlar, arşivler ve alt modüller ile birçok gıt sembolik bağları, ve herhangi bir yerel destek (henüz) piyasaya sürümü MsysGit için akıllıca kullanma bu sembolik Windows ev sahipliği yapıyor.
Git tamamlar gerçeğine işaret için Josh Lee sayesinde 120000
özel filemode ile sembolik. Bu bilgi ile mümkün Windows bilgisayarlar üzerinde gıt sembolik bağ oluşturma ve manipülasyon için izin kaç git bir takma ad eklemek için.
Oluşturma gıt Windows sembolik
2014-11-12 GÜNCELLENDİ(aşağıya bakınız)
git config --global alias.add-symlink '!__git_add_symlink(){ argv=($@) argc=${#argv[@]} # Look for options options=(" -h") o_help="false" case "${argv[@]}" in *" -h"*) o_help="true" ;; esac if [ "$o_help" == "true" -o "$argc" -lt "2" ]; then echo "\ Usage: git add-symlink <src> <dst> * <src> is a RELATIVE PATH, respective to <dst>. * <dst> is a RELATIVE PATH, respective to the repository'\''s root dir. * Command must be run from the repository'\''s root dir." return 0 fi src_arg=${argv[0]} dst_arg=${argv[1]} dst=$(echo "$dst_arg")/../$(echo "$src_arg") if [ ! -e "$dst" ]; then echo "ERROR: Target $dst does not exist; not creating invalid symlink." return 1 fi hash=$(echo -n "$src_arg" | git hash-object -w --stdin) git update-index --add --cacheinfo 120000 "$hash" "$dst_arg" git checkout -- "$dst_arg" }; __git_add_symlink "$@"'
Kullanımı:
<src>
neredegit add-symlink <src> <dst>
,göreli başvuru(<dst>
saygı ile) dosya veya dizini mevcut yere bağlamak,<dst>
göreli başvuru(depoyu köküne saygı) ile bağlantı için hedef gerekli.E. g., depo ağaç:
dir/ dir/foo/ dir/foo/bar/ dir/foo/bar/baz (file containing "I am baz") dir/foo/bar/lnk_file (symlink to ../../../file) file (file containing "I am file") lnk_bar (symlink to dir/foo/bar/)
Aşağıdaki gibi Windows üzerinde oluşturulabilir
git init mkdir -p dir/foo/bar/ echo "I am baz" > dir/foo/bar/baz echo "I am file" > file git add -A git commit -m "Add files" git add-symlink ../../../file dir/foo/bar/lnk_file git add-symlink dir/foo/bar/ lnk_bar git commit -m "Add symlinks"
NTFS yerine git sembolik kavşaklar hardlinks
git config --global alias.rm-symlink '!__git_rm_symlink(){ git checkout -- "$1" link=$(echo "$1") POS=$'\''/'\'' DOS=$'\''\\\\'\'' doslink=${link//$POS/$DOS} dest=$(dirname "$link")/$(cat "$link") dosdest=${dest//$POS/$DOS} if [ -f "$dest" ]; then rm -f "$link" cmd //C mklink //H "$doslink" "$dosdest" elif [ -d "$dest" ]; then rm -f "$link" cmd //C mklink //J "$doslink" "$dosdest" else echo "ERROR: Something went wrong when processing $1 . . ." echo " $dest may not actually exist as a valid target." fi }; __git_rm_symlink "$1"' git config --global alias.rm-symlinks '!__git_rm_symlinks(){ for symlink in $(git ls-files -s | egrep "^120000" | cut -f2); do git rm-symlink "$symlink" git update-index --assume-unchanged "$symlink" done }; __git_rm_symlinks'
Kullanımı:
git rm-symlink dir/foo/bar/lnk_file git rm-symlink lnk_bar git update-index --assume-unchanged dir/foo/bar/lnk_file git update-index --assume-unchanged lnk_bar
Bu sembolik tek tek, NTFS hardlinks (dosya halinde) değiştirme veya NTFS kavşaklar (dizin halinde) gıt kaldırır. Hardlinks kullanmanın faydası "true" NTFS sembolik . üzerinde kavşaklar ^em>yüksek UAC izinlerini onları oluşturulması için gerekli değildir.Son olarak, kendi boş,--modifiye unflag (ya da değil) ""
git update-index
. ile sembolik kaldırıldı seçebilirsinizKolaylık için, aynı zamanda sadece çalıştırabilirsiniz:
git rm-symlinks
Bu geçerli depodaki TÜM gıt sembolik, gerektiğinde hardlinks kavşaklar ile bunların yerine kaldırırotomatik olarakdeğişiklikleri işaretleme
git status
tarafından gözardı edilecektir.Alt modüller gelen sembolik kaldırmak için, sadece git-dahili onları üzerinden yineleme için destek:
git submodule foreach --recursive git rm-symlinks
Ama, böyle her ciddi eylem için, bir geri dönüş olması güzel
Windows Geri git sembolik
git config --global alias.checkout-symlinks '!__git_checkout_symlinks(){ POS=$'\''/'\'' DOS=$'\''\\\\'\'' for symlink in $(git ls-files -s | egrep "^120000" | cut -f2); do git update-index --no-assume-unchanged "$symlink" dossymlink=${symlink//$POS/$DOS} cmd //C rmdir //Q "$dossymlink" 2>/dev/null git checkout -- "$symlink" echo "Restored git symlink $symlink <<===>> $(cat $symlink)" done }; __git_checkout_symlinks'
Kullanımı:
git rm-symlinks
etkili doğal haline depoyu geri geri alırgit checkout-symlinks
, (yaptığınız değişiklikleri dışındagerekir) olduğu gibi kalır.Ve alt modüller:
git submodule foreach --recursive git checkout-symlinks
Sınırlamalar:
- Sadece repo kökünden, başka çalıştırılabilir, tuhaflık
- Sekme tabanlı otomatik tamamlama bu takma yazarak zaman bozulur
İnsanlar 29 **
git add -A
gibi bir şey yapmadan önce unutmamrepo kirletiyor!"Önce":. örnek repo bizim kullanma
echo "I am nuthafile" > dir/foo/bar/nuthafile echo "Updating file" >> file git add -A git status # On branch master # Changes to be committed: # (use "git reset HEAD <file>..." to unstage) # # new file: dir/foo/bar/nuthafile # modified: file # deleted: lnk_bar # POLLUTION # new file: lnk_bar/baz # POLLUTION # new file: lnk_bar/lnk_file # POLLUTION # new file: lnk_bar/nuthafile # POLLUTION #
Hoppala...
Bu nedenle, Windows kullanıcıları için gerçekleştirmek için gereken adımları gibi bu isimler eklersek iyi öncesi-sonrası itmeden önce ödeme sonra bir inşaat projesi yerine ya. Ama her durum farklıdır. Bu isimler post-çıkış gerçek bir çözüm gerekli olmamıştır benim için yeterince faydalı olmuştur.
Bu yardımcı olur umarım!
Referanslar:
http://git-scm.com/book/en/Git-Internals-Git-Objects
http://technet.microsoft.com/en-us/library/cc753194
GÜNCELLEME 2014-11-12:Ben şahsen sadece hiç rm-symlinks
checkout-symlinks
diğer adları üstünde ağır kullandı çünkü, add-symlink
alias oldukça kötü bir hata göz ardı etmeyi başardım. Daha önce, -n
almıyorum geçirilen echo
deyimi sorumlu oluşturma gıt sembolik bağ dosyası olur sonra ekledi hazırlama alanı olarak bir kısmı add-symlink
'In çalışması. Bu sondaki yeni satır (0x0D 0x0A
Windows bilgisayarlar üzerinde) bütün gıt sembolik add-symlink
ile oluşturulan eklenmeye anlamına gelir. Bu gıt sembolik hala "taşınabilir" Windows bilgisayarları ile rm-symlinks
gayet iyi, eğer onlar şimdiye kadar işlediği için bir kamu repo ve daha sonra klonlanmış bir gerçek posıx tabanlı bir sistem,bu bağlantılar her zaman diğer tarafta kırık gelirdi. Bu sorun giderildi ve add-symlink
şimdi beklendiği gibi çalışması gerekir.
Çalışan JAR Windows dosya üzerinde...
Nasıl 'git diff sonuçları çıkış&#...
Tarih biçimi ve Windows toplu iş komut...
Windows toplu: FOR döngüsü içinde bird...
Swing destek seçeneğimiz dosya 7, Wind...