SORU
6 Mayıs 2011, Cuma


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:

  1. Eğer varsa, ne olumsuzlukları bu yaklaşım görüyor musunuz?
  2. Bu yazı-ödeme senaryoyu bile uygulanabilir mi? yani ben özyinelemeli olarak kukla bulun "sembolik" dosyaları oluşturur gıt?
  3. Kimse zaten böyle bir senaryo üzerinde çalıştı? =)

Çok teşekkürler!

CEVAP
25 Mayıs 2013, CUMARTESİ


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.

  1. 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
  2. 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.
  3. 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.

  1. 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> nerede git 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"
    
  2. 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çebilirsiniz

    Kolaylı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

  3. 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ır git 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
    
  4. Sınırlamalar:

    1. Sadece repo kökünden, başka çalıştırılabilir, tuhaflık
    2. Sekme tabanlı otomatik tamamlama bu takma yazarak zaman bozulur
    3. İ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.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • BigDawsTv

    BigDawsTv

    20 HAZİRAN 2012
  • Liz Morgan

    Liz Morgan

    4 Aralık 2011
  • Mark Halberstadt

    Mark Halbers

    19 ŞUBAT 2010