Windows'ta Git Symlinks


246

Geliştiricilerimiz, Windows ve Unix tabanlı işletim sistemlerinin bir karışımını kullanıyor. Bu nedenle, Unix makinelerinde oluşturulan semboller Windows geliştiricileri için bir sorun haline gelir. Windows'ta (msysgit), sembolik bağlantı işaret ettiği dosyanın yolunu içeren bir metin dosyasına dönüştürülür. Bunun yerine, symlink'i gerçek bir Windows symlink'e dönüştürmek istiyorum.

Bunun için gereken ( güncellenmiş ) çözüm:

  • "Symlink" metin dosyalarını özyineli olarak arayacak bir ödeme sonrası komut dosyası yazın.
  • Bunları, sahte "symlink" ile aynı ad ve uzantıya sahip Windows Symlink (mklink kullanarak) ile değiştirin
  • .Git / info / exclude dosyasına giriş ekleyerek bu pencere işaretini yok sayın

Bunu ben uygulamamıştım ama bunun bu soruna sağlam bir yaklaşım olduğuna inanıyorum.

Sorular:

  1. Varsa, bu yaklaşımın olumsuz yanlarını görüyorsunuz?
  2. Bu ödeme sonrası komut dosyası uygulanabilir mi? Yani git oluşturur kukla "symlink" dosyaları özyineli olarak bulabilir miyim?
  3. Daha önce böyle bir senaryo üzerinde çalışan var mı?

3
Git sembolik bağlantıları desteklese de, özellikle de Windows'da bu kodla çalışıyorsanız , bunları havuzunuzda bağlantılar olarak saklamamanızı şiddetle tavsiye ederim .
Greg Hewgill

2
@Greg Hewgill - Sana tamamen katılıyorum. Ne yazık ki, kod tabanımızın doğası sembolik bağlantılar gerektiriyor ... bu yüzden bunları kaldırmak bizim için bir seçenek değil.
Ken Hirakawa

12
Ayrıca msysgit e-posta listesinde neden ilk etapta böyle uygulamadıklarını sorabilirsiniz.
drizzd

8
@GregHewgill neden olmasın? Windows hem sembolik bağlantıları hem de kavşakları destekler - bu bana
Git'in

6
Windows 10'da "Geliştirici Modu" etkinken sembol bağlantıları oluşturmak için Yönetici hakları gerekmez! (Diğerleri daha az oy kullanan cevaplar hakkında yorum yaptı, ancak ben onları görmedim. Bu yorumu umut ediyorum gelecekteki okuyucular için daha görünür.)
Dave Pascua

Yanıtlar:


105

Simgeleri 120000, muhtemelen bu komutla modu olan dosyaları arayarak bulabilirsiniz :

git ls-files -s | awk '/120000/{print $4}'

Bağlantıları değiştirdikten sonra, bunları git update-index --assume-unchangedlistelemek yerine değişmeden olarak işaretlemenizi tavsiye ederim .git/info/exclude.


2
Awk msysgit için gawk ile değiştirmek zorunda kaldı, ama aksi takdirde mükemmel çalıştı. Teşekkürler!
Ken Hirakawa

6
helo ken. symlink metin dosyalarını kontrol eden ve mklink kullanarak pencerelerde sembolik kodlarla değiştiren komut dosyanızı paylaşır mısınız? bu bizim için gerçekten işe yarıyor olsa da --gösterim-değişmeyen kısım işe yaramaz. başka bir şubeye geçişte git, symlink dosyalarının değiştiğini ve önce taahhüt edilmesi gerektiğini söylerken, git durumu değişiklik olmadığını söylüyor .. herhangi bir fikir?
joreg

6
İşte bir araya getirdiğim
ferventcoder 16:13

3
@flungo Dördüncü sütunu yazdırmak için GNU awk kullanmaktan daha taşınabilir yollar vardır. Örneğin: git ls-files -s | grep '^12' | cut -f2(ikinci sekmeyle ayrılmış sütun; diğer sütunlar boşlukla ayrılmış)
Zenexer

1
Cygwin / for f in `git ls-files -s | awk '/120000/{print $4}'`; do git update-index --assume-unchanged $f; done
bash'ın

187

Bu aynı soruyu bir süre önce soruyordum (burada değil, sadece genel olarak) ve OP'nin önerisine çok benzer bir çözüm buldum. Öncelikle 1 2 ve 3 sorularına doğrudan cevap vereceğim ve sonra kullandığım çözümü göndereceğim.

  1. Gerçekten de önerilen çözümün, esasen depo kirliliği potansiyelinin artması veya "Windows symlink" durumlarındayken yanlışlıkla yinelenen dosyalar eklemeyle ilgili birkaç dezavantajı vardır. (Bununla ilgili aşağıdaki "sınırlamalar" başlığı altında daha fazlası.)
  2. Evet, ödeme sonrası bir komut dosyası uygulanabilir! Belki gerçek bir post- git checkoutadım olarak değil , ancak aşağıdaki çözüm, gerçek bir ödeme sonrası komut dosyası gerekli olmayacak kadar ihtiyaçlarımı karşıladı.
  3. Evet!

Çözüm:

Geliştiricilerimiz OP'lerle hemen hemen aynı durumda: Windows ve Unix benzeri ana bilgisayarların, havuzların ve birçok git sembolüne sahip alt modüllerin bir karışımı ve MsysGit'in yayın sürümünde bu ana bilgisayarları Windows ana bilgisayarlarında akıllıca işlemek için yerel bir destek (henüz) yok .

Josh Lee'ye git'in özel filemode ile sembolik bağlar yaptığına dikkat çektiği için teşekkürler 120000. Bu bilgilerle, Windows ana bilgisayarlarında git simgelerinin oluşturulmasına ve değiştirilmesine izin veren birkaç git diğer adı eklemek mümkündür.

  1. Windows'ta git simgeleri oluşturma

    git config --global alias.add-symlink '!'"$(cat <<'ETX'
    __git_add_symlink() {
      if [ $# -ne 2 ] || [ "$1" = "-h" ]; then
        printf '%b\n' \
            'usage: git add-symlink <source_file_or_dir> <target_symlink>\n' \
            'Create a symlink in a git repository on a Windows host.\n' \
            'Note: source MUST be a path relative to the location of target'
        [ "$1" = "-h" ] && return 0 || return 2
      fi
    
      source_file_or_dir=${1#./}
      source_file_or_dir=${source_file_or_dir%/}
    
      target_symlink=${2#./}
      target_symlink=${target_symlink%/}
      target_symlink="${GIT_PREFIX}${target_symlink}"
      target_symlink=${target_symlink%/.}
      : "${target_symlink:=.}"
    
      if [ -d "$target_symlink" ]; then
        target_symlink="${target_symlink%/}/${source_file_or_dir##*/}"
      fi
    
      case "$target_symlink" in
        (*/*) target_dir=${target_symlink%/*} ;;
        (*) target_dir=$GIT_PREFIX ;;
      esac
    
      target_dir=$(cd "$target_dir" && pwd)
    
      if [ ! -e "${target_dir}/${source_file_or_dir}" ]; then
        printf 'error: git-add-symlink: %s: No such file or directory\n' \
            "${target_dir}/${source_file_or_dir}" >&2
        printf '(Source MUST be a path relative to the location of target!)\n' >&2
        return 2
      fi
    
      git update-index --add --cacheinfo 120000 \
          "$(printf '%s' "$source_file_or_dir" | git hash-object -w --stdin)" \
          "${target_symlink}" \
        && git checkout -- "$target_symlink" \
        && printf '%s -> %s\n' "${target_symlink#$GIT_PREFIX}" "$source_file_or_dir" \
        || return $?
    }
    __git_add_symlink
    ETX
    )"
    

    Kullanım:, git add-symlink <source_file_or_dir> <target_symlink>burada kaynak dosyaya veya dizine karşılık gelen bağımsız değişken hedef sembolik bağa göre bir yol biçiminde olmalıdır . Bu takma adı normalde kullandığınız gibi kullanabilirsiniz ln.

    Örneğin, depo ağacı:

    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/)
    

    Windows üzerinde aşağıdaki gibi 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. Git simgelerini NTFS sabit bağlantıları + kavşaklarla değiştirme

    git config --global alias.rm-symlinks '!'"$(cat <<'ETX'
    __git_rm_symlinks() {
      case "$1" in (-h)
        printf 'usage: git rm-symlinks [symlink] [symlink] [...]\n'
        return 0
      esac
      ppid=$$
      case $# in
        (0) git ls-files -s | grep -E '^120000' | cut -f2 ;;
        (*) printf '%s\n' "$@" ;;
      esac | while IFS= read -r symlink; do
        case "$symlink" in
          (*/*) symdir=${symlink%/*} ;;
          (*) symdir=. ;;
        esac
    
        git checkout -- "$symlink"
        src="${symdir}/$(cat "$symlink")"
    
        posix_to_dos_sed='s_^/\([A-Za-z]\)_\1:_;s_/_\\\\_g'
        doslnk=$(printf '%s\n' "$symlink" | sed "$posix_to_dos_sed")
        dossrc=$(printf '%s\n' "$src" | sed "$posix_to_dos_sed")
    
        if [ -f "$src" ]; then
          rm -f "$symlink"
          cmd //C mklink //H "$doslnk" "$dossrc"
        elif [ -d "$src" ]; then
          rm -f "$symlink"
          cmd //C mklink //J "$doslnk" "$dossrc"
        else
          printf 'error: git-rm-symlink: Not a valid source\n' >&2
          printf '%s =/=> %s  (%s =/=> %s)...\n' \
              "$symlink" "$src" "$doslnk" "$dossrc" >&2
          false
        fi || printf 'ESC[%d]: %d\n' "$ppid" "$?"
    
        git update-index --assume-unchanged "$symlink"
      done | awk '
        BEGIN { status_code = 0 }
        /^ESC\['"$ppid"'\]: / { status_code = $2 ; next }
        { print }
        END { exit status_code }
      '
    }
    __git_rm_symlinks
    ETX
    )"
    
    git config --global alias.rm-symlink '!git rm-symlinks'  # for back-compat.
    

    Kullanımı:

    git rm-symlinks [symlink] [symlink] [...]
    

    Bu takma ad git bağlantı sembollerini tek tek veya her defasında tek seferde kaldırabilir. Simge bağlantıları NTFS sabit bağlantıları (dosyalar söz konusu olduğunda) veya NTFS bağlantıları (dizinler söz konusu olduğunda) ile değiştirilecektir. "Gerçek" NTFS bağlantıları üzerinde hardlinkler + kavşaklar kullanmanın yararı, yaratılmaları için yükseltilmiş UAC izinlerine gerek olmamasıdır.

    Alt modüllerdeki sembolik bağlantıları kaldırmak için git'in yerleşik desteğini yineleme için kullanın:

    git submodule foreach --recursive git rm-symlinks
    

    Ancak, bu gibi her şiddetli eylem için, bir geri dönüşün olması güzel ...

  3. Windows'ta git simgelerini geri yükleme

    git config --global alias.checkout-symlinks '!'"$(cat <<'ETX'
    __git_checkout_symlinks() {
      case "$1" in (-h)
        printf 'usage: git checkout-symlinks [symlink] [symlink] [...]\n'
        return 0
      esac
      case $# in
        (0) git ls-files -s | grep -E '^120000' | cut -f2 ;;
        (*) printf '%s\n' "$@" ;;
      esac | while IFS= read -r symlink; do
        git update-index --no-assume-unchanged "$symlink"
        rmdir "$symlink" >/dev/null 2>&1
        git checkout -- "$symlink"
        printf 'Restored git symlink: %s -> %s\n' "$symlink" "$(cat "$symlink")"
      done
    }
    __git_checkout_symlinks
    ETX
    )"
    
    git config --global alias.co-symlinks '!git checkout-symlinks'
    

    Kullanımı: git checkout-symlinks [symlink] [symlink] [...], undoes git rm-symlinksetkili bir (sizin geçiş haricinde doğal haline depo geri, gereken bozulmadan kal).

    Ve alt modüller için:

    git submodule foreach --recursive git checkout-symlinks
    
  4. Sınırlamalar:

    • Yollarında boşluk bulunan dizinler / dosyalar / semboller çalışmalıdır. Ancak sekmeler veya yeni satırlar? YMMV ... (Şunu demek istiyorum: bunu yapmaz, çünkü olmaz işler.)

    • Kendiniz veya başkaları git checkout-symlinkspotansiyel olarak geniş kapsamlı sonuçları olan bir şey yapmadan önce unutursa git add -A, yerel depo kirli bir duruma gelebilir .

      Önceden "örnek repo" yu kullanarak:

      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
      #
      

      Tüh ...

      Bu nedenle, bu diğer adları Windows kullanıcıları için bir projeyi oluşturmadan önce ve sonra, ödemeden sonra veya itmeden önce gerçekleştirme adımları olarak eklemek güzeldir. Fakat her durum farklı. Bu takma adlar, gerçek bir ödeme sonrası çözümün gerekli olmadığı benim için yeterince yararlı oldu.

Umarım yardımcı olur!

Referanslar:

http://git-scm.com/book/en/Git-Internals-Git-Objects

http://technet.microsoft.com/en-us/library/cc753194

Son Güncelleme: 2019-03-13

  • POSIX uyumluluğu ( mklinkelbette bu aramalar hariç ) - artık Bashizm yok !
  • İçinde boşluk bulunan dizinler ve dosyalar desteklenir.
  • Sıfır ve sıfır olmayan çıkış durum kodları (sırasıyla istenen komutun başarısını / başarısızlığını iletmek için) artık düzgün bir şekilde korunmuş / iade edilmiştir.
  • Diğer add-symlinkad artık daha çok ln (1) gibi çalışıyor ve yalnızca deponun kök dizininde değil, depodaki herhangi bir dizinde kullanılabilir.
  • rm-symlink(Tekil) takma yerini aldığı rm-symlinksseçici NTFS sabit bağlarının + birleşme halinde git sembolik dönüştürmek için (daha önce olduğu gibi, depo boyunca sembolik tüm bulur ya da hiç argüman) artık birden fazla bağımsız değişkenleri kabul takma (çoğul), .
  • checkout-symlinksTakma ayrıca (==, hiç veya hiç herşeyi) birden fazla argüman kabul etmek yukarıda belirtilen dönüşümlerin seçici iptali için güncellendi.

Son Not: Bu takma adların Bash 3.2 (ve hatta 3.1) kullanılarak herhangi bir nedenden ötürü hala eski versiyonlara takılı kalanlar için test edilip çalıştırılmasına rağmen, bu kadar eski sürümlerin ayrıştırıcıları için kötü şöhretli olduklarını unutmayın. böcek. Bu takma adlardan herhangi birini yüklemeye çalışırken sorun yaşıyorsanız, bakmanız gereken ilk şey kabuğunuzu yükseltmektir (Bash için sürümü CTRL + X, CTRL + V ile kontrol edin). Alternatif olarak, bunları terminal öykünücünüze yapıştırarak yüklemeye çalışıyorsanız, bunları bir dosyaya yapıştırarak ve bunun yerine kaynak yaparak daha fazla şansınız olabilir.

. ./git-win-symlinks.sh

İyi şanslar!


lütfen buraya bir göz atabilir misin? stackoverflow.com/questions/21403772/…
Goofy

Bu harika ve harika bir betik, ama git add-symlink ile oluşturduğum bazı dosyalarımın sonunda rasgele "git" kelimesini eklemenin bir nedeni var mı?
Peter Turner

Ayrıca, dosya adınız "-h" içeriyorsa, kullanımı elde edersiniz. Hala çok yararlı bir senaryo!
Peter Turner

Sizin git add-symlinktarifi benim için fevkalade değerli olmuştur. Çok teşekkürler.
Dan Lenski

1
Bu komut dosyalarını kancaları kullanarak otomatik olarak yürütmenin herhangi bir yolu var mı?
ARF

74

Git scm'nin (testet 2.11.1) en son sürümü sembolik bağlantıların etkinleştirilmesine izin verir. Ancak havuzu tekrar semboliklerle klonlamanız gerekir git clone -c core.symlinks=true <URL>. Bu komutu yönetici haklarıyla çalıştırmanız gerekir. Ayrıca mklink ile Windows üzerinde semboller oluşturmak da mümkündür. Check wiki .

resim açıklamasını buraya girin


1
Bu benim için işe yaramadı. Git'i Windows için yeniden yükledim, sembolik onay kutusunu işaretlemeyi ve projemi tekrar klonlamayı unutmayın. Benim tslint.jsonana dizinine başvuran dosyası hâlâ içerir ../tslint.json. Yazık, çünkü bu gerçekten orada önerilen tüm çözümlerin en kolayı gibi görünüyordu.
Jan Aagaard

8
@JanAagaard Bunu klonlamanız gerekiyor: git clone -c core.symlinks=true <URL> Ve Windows'ta yönetici haklarıyla çalıştırmanız gerekiyor.
sirlunchalot

6
@ARF "gpedit.msc'yi (örn. Grup ilkesi düzenleyicisini) başlatın ve hesapları Bilgisayar yapılandırması \ Windows Ayarı \ Güvenlik Ayarları \ Yerel İlkeler \ Kullanıcı Hakları Ataması \ Sembolik bağlantılar oluşturun."
sirlunchalot

2
@sirlunchalot Yardımınız için teşekkürler. O zamandan beri benim sorun Yöneticilerim grubunun bir parçası olduğunu ve bu özellik bu kullanıcılar için hiçbir etkisi olduğunu fark ettim. Git'in yapmadığı UAC yükselmesi gerektirirler.
ARF

9
Windows 10 Creators Güncellemesi'ndeki "Geliştirici Modu" nda yönetici hakları gerekli değildir . Teşekkür içinde @dennis onun comment .
Dominik

16

Msysgit'de uygulanması gerekir, ancak iki dezavantajı vardır:

  • Sembolik bağlantılar yalnızca Windows Vista ve sonraki sürümlerde kullanılabilir (2011'de bir sorun olmamalı ve yine de ...), çünkü eski sürümler yalnızca dizin bağlantılarını destekliyor.
  • (büyük olanı) Microsoft sembolik bağlantıları bir güvenlik riski olarak kabul eder ve bu nedenle varsayılan olarak yalnızca yöneticiler oluşturabilir. Git işleminin ayrıcalıklarını yükseltmeniz veya üzerinde çalıştığınız her makinede bu davranışı değiştirmek için fstool kullanmanız gerekir.

Hızlı bir arama yaptım ve bu konuda aktif olarak yapılan işler var, bkz. Sayı 224 .


2
Güncelleme: yukarıdaki nedenlerden dolayı, sorun alışkanlık olarak kapatıldı. Tartışma, düzeltme ekinin yama üzerinde biraz daha çalışmayla kabul edilebileceğini göstermektedir (örneğin, yalnızca çalışırsa sembol bağlantılarını kullanarak).
Blaisorblade

2
A.) şu anda msysgit sembolik bağlantıları hiç desteklemiyor - bu yüzden neden "oh NTFS ile vista üzerinde olursanız symlinks kullanmama izin ver" veya "oh, NTFS ile kavşakları destekleyen bir işletim sistemindesiniz, bunları kullanmama izin verin "veya" ah, windows 98 / fat32 üzerindesiniz, bu özelliğe sahip olmamak ve bunun yerine size bir uyarı vermek için geri dönmeme izin verin! " ve sonra B.) Microsoft'un dev. bir yönetici olarak çalıştırmazsanız, araçlar doğru çalışmaz (en azından tüm özellikleri için değil) - BT'deki herkes geliştiricilerin kendi kutularında yönetici olması gerektiğini bilir.
BrainSlugs83

1
Yönetici hesabında belirli makineleri çalıştırırken, bu felsefeyi geliştirme makinemde takip etmiyorum. Her zaman UAC özellikli normal bir kullanıcı olarak çalışırım. Yükseltilmiş ayrıcalıklar gerektiren işlemler için ayrı bir konsolu açık tutuyorum. Bunun uygulanmasına gelince, bunu uygulamak için gönüllü olan (sizin gibi) birine gelir. Msysgit geliştiriciler yardım amaçlı bilinmeyen ...
djs

@djs Bir Kullanıcının "Yönetici Olarak Çalıştır" komut istemini açması gerekir. Ortamı tamamen değiştiren Yönetici Kullanıcı olarak neredeyse tam anlamıyla çalışıyor. Yönetici grubunda da bulunan bir Kullanıcı olarak 'mklink / d' çalıştırmanın bir yolu yoktur. UAC istemi olmayacak. Her zaman başarısız olur. Sadece iki şekilde çalışır: Kelimenin tam anlamıyla Yönetici kullanıcı (RunAs Verb) veya grup ilkesi değişikliği olan yönetici olmayan bir Kullanıcı olarak. Kavşaklar varsayılan olmalı ve tüm araçlar tarafından tanınmalıdır. 'Güvenlik riski', Windows üzerindeki sembol bağlantılarının KOBİ paylaşımlarını 'yeniden yönlendirebilmesidir'. Bu bir acı ve acımasız.
Andrew T Finnell

8
Aralık 2016'da duyuruldu, Windows 10'daki Symlinks artık bir Yönetici eylemi değil. blogs.windows.com/buildingapps/2016/12/02/symlinks-windows-10/…
Dennis

16

Bu nedenle, bu cevapların bir sürü yayınlandığından beri GIT ile işler değiştiğinden, sembol bağlantılarının pencerelerde doğru çalışmasını sağlamak için doğru talimatlar

AĞUSTOS 2018


1. git'in symlink desteği ile yüklendiğinden emin olun

Git'in Windows'a yüklenmesi sırasında

2. Bash'e sembolik bağlantılar yerine hardlinks oluşturmalarını söyleyin

DÜZENLE - (git klasörü) /etc/bash.bashrc

ALT EKLE EKLE - MSYS=winsymlinks:nativestrict

3. Git config sembolik bağlantıları kullanacak şekilde ayarla

git config core.symlinks true

veya

git clone -c core.symlinks=true <URL>

NOT: Bunu global git config'a eklemeyi denedim ve şu anda benim için çalışmıyor, bu yüzden her bir repoya eklemenizi öneririz ...

4. repo çekin

NOT: Windows 10'un en son sürümünde geliştirici modunu etkinleştirmediyseniz, semboller oluşturmak için bash'yi yönetici olarak çalıştırmanız gerekir

5. Tüm Sembolleri Sıfırla (isteğe bağlı) Mevcut bir deponuz varsa veya alt modüller kullanıyorsanız, sembollerin doğru oluşturulmadığını görebilirsiniz, böylece repodaki tüm sembolleri yenilemek için bu komutları çalıştırabilirsiniz.

find -type l -delete
git reset --hard

NOT: Bu, son işlemden bu yana yapılan değişiklikleri sıfırlayacaktır, bu yüzden önce taahhüt ettiğinizden emin olun


15

Kısa cevap: Geliştirici modunu etkinleştirebiliyorsanız, bunlar artık güzel bir şekilde desteklenmektedir.

Gönderen https://blogs.windows.com/buildingapps/2016/12/02/symlinks-windows-10/

Şimdi Windows 10 Creators Update'te, bir kullanıcı (yönetici haklarına sahip) önce Geliştirici Modu'nu etkinleştirebilir ve daha sonra makinedeki herhangi bir kullanıcı bir komut satırı konsolunu yükseltmeden mklink komutunu çalıştırabilir.

Bu değişikliği ne sürükledi? Simgelerin kullanılabilirliği ve kullanımı modern geliştiriciler için çok önemlidir:

Git ve npm gibi paket yöneticileri gibi birçok popüler geliştirme aracı, sırasıyla depo veya paket oluştururken sembolik bağlantıları tanır ve devam ettirir. Bu depolar veya paketler başka bir yere geri yüklendiğinde, semboller de geri yüklenerek disk alanının (ve kullanıcının zamanının) boşa harcanmamasını sağlar.

"İçerik Oluşturucunun güncellemesi" nin diğer tüm açıklamalarıyla kolayca gözden kaçabilir, ancak Geliştirici Modu'nu etkinleştirirseniz, yükseltilmiş ayrıcalıklara sahip olmayan semboller oluşturabilirsiniz. Git'i yeniden yüklemeniz ve varsayılan olarak olmadığı için sistem bağlantısı desteğinin etkinleştirildiğinden emin olmanız gerekebilir.

Sembolik Bağlantılar varsayılan olarak etkin değildir


1
gpedit.msc-> Local Computer Policy-> Computer Configuration-> Windows Settings-> Security Settings-> Local Policies-> User Rights Assignmentgibi kullanıcı hakları SeCreateSymbolicLinkve çağlar boyunca arkadaş atamak için kanonik bir yol olmuştur . Dışında ntrights.exeKaynak Seti veya PowerShell ... dan
0xC0000022L

11

2020 Cevap

  1. Windows 10'da "Geliştirici modu" nu etkinleştirin - mklinkizin verir
  2. Git'te sembol bağlantılarının etkinleştirildiğinden emin olun
    • git config --global core.symlinks true
    • veya msysgit'i yüklerken onay kutusunu işaretleyin

Dalları değiştirmek eksik sembollerin yeniden yaratılmasını zorlayacaktır.

Dikkatli olun, diğer Git istemcileriyle Windows'taki Symlinks desteği tam değildir. Özellikle GitKraken.


Tüm yerel depolarım, çözümünüzü geçersiz kılacak core.symlinks = false değerine sahip. Bu yerel yapılandırmanın otomatik olarak ne ürettiği hakkında bir fikriniz var mı? Onay kutusunu işaretlemeden Windows için Git uygulamasını yükleyebiliyor musunuz?
gravidThoughts

Hangi git istemcilerini yüklediğinize rağmen? Belki bazı aletler bunu yapıyor? Bu taze bir klon için geçerli mi?
Cameron Tacklind

10

Repo içerisinde sembolik bağlar kullanmamanızı öneririm. Asıl içeriği depoda saklayın ve ardından içeriğe işaret eden sembolik bağların yanına yerleştirin.

Diyelim ki bir repo kullanıyorsunuz 'sitenizi * nix'te barındırma ile kazanmak üzerine hosting karşılaştırmak. İçeriği deponuzda saklayın 'diyelim /httpRepoContentve c:\httpRepoContentbununla birlikte GIT, SVN vb. İle senkronize edilen klasör.

Ardından, web sunucunuzun içerik klasörünü ( /var/wwwve c:\program files\web server\www{adlar gerçekten önemli değil, gerekirse düzenleyin}) deponuzdaki içeriğe sembolik bir bağlantıyla değiştirin '. Web sunucuları içeriği gerçekte 'doğru' yerde görecek, ancak kaynak denetiminizi kullanacaksınız.

Bununla birlikte, repoda sembolik bağlantıları kullanmanız gerekiyorsa, bir tür ön / son komut dosyası gibi bir şeye bakmanız gerekir. Bunları, örneğin bir formatlayıcı aracılığıyla kod dosyalarını ayrıştırma gibi şeyler yapmak için kullanabileceğinizi biliyorum, bu yüzden platformlar arasındaki sembolik bağlantıları dönüştürmek mümkün olmalıdır.

herhangi biri ortak kaynak kontrolleri, SVN GIT MG için bu komut dosyalarını nasıl yapacağınızı öğrenmek için iyi bir yer biliyorsa, lütfen bir yorum ekleyin.


Sonunda, bir symlink-out klasörü oluşturmak ve orijinal dosyanın olduğu yere sembolik bağlantılar oluşturmak için bu yaklaşımı seçtim. .Git / config ayar core.symlinks = true değiştirdikten sonra bile diğer yaklaşım işe yaramadı. Repoya yalnızca sembolik bağlantı dosyası kaydedildi, veriler kaydedilmedi. Ayrıca sembolik bağlantıda klasör zaman damgaları ile ilgili sorunlar vardı, bu yüzden git bash klasör içinde bir dosya değiştiğinde hiç görmedim.
Yumurtalar

@Eggs Görüyor olabilirsiniz, sanırım, bağlantı repo içinde olduğunu ve böylece git kaydedildi, basit. Ancak sorun, hedefin repo dışında olması ve git'in hedef verilere olan bağlantıyı izlememesidir. Linux'ta bunun için işe yarayacak bir tür bağlantınız var, temel olarak diskte depolanan aynı verilere iki yolunuz var; Newish pencerelerinin bunu şimdi yapabileceğini hissediyorum. Her iki durumda da, hala insanların istediklerini yapacaklarını düşünmüyorum.
thecoshman

@thecoshman Bu bir çözüm değil, geçici bir çözümdür. Ancak, bazen bu bir seçenek değildir. Git-ek ile bir havuzum var, tüm mimarisi sembolik bağlantılar nedeniyle çalışıyor.
marcelo.guedes

8

Vista, Win7 veya üzeri sürümlerde CygWin kullananlar için , yerel gitkomut Android Studio gibi Windows uygulamaları tarafından tanınan "uygun" semboller oluşturabilir . CYGWINOrtam değişkenini dahil edilecek şekilde winsymlinks:nativeveya winsymlinks:nativestrictbu şekilde ayarlamanız yeterlidir :

export CYGWIN="$CYGWIN winsymlinks:native"

Bunun dezavantajı (ve bunun önemli bir kısmı), CygWin kabuğunun bu tür sembolik bağlantıları oluşturmak için gereken işletim sistemi izinlerine sahip olması için "Yönetici Olarak Çalıştır" olması gerektiğidir. Ancak oluşturulduktan sonra bunları kullanmak için özel bir izin gerekmez . Depoda başka bir geliştirici tarafından değiştirilmediği sürece git, normal kullanıcı izinleriyle sorunsuz çalışır.

Şahsen ben bu kullanmak sadece bu nedenle ilave zorluk Windows uygulamaları gezinilen sembolik (yani olmayan Cygwin'ın) için.

Bu seçenek hakkında daha fazla bilgi için şu SO sorusuna bakın: Windows 7'de cygwin ile sembolik bağlantı nasıl yapılır


6

Burada, Josh Lee'nin cevabına dayanan, yalnızca dosyalar için depodaki sembolik bağlantıları dönüştürmek için bir toplu komut dosyası. Yönetici hakları için ek kontrol içeren komut dosyası https://gist.github.com/Quazistax/8daf09080bf54b4c7641 adresinde bulunmaktadır .

@echo off
pushd "%~dp0"
setlocal EnableDelayedExpansion

for /f "tokens=3,*" %%e in ('git ls-files -s ^| findstr /R /C:"^120000"') do (
     call :processFirstLine %%f
)
REM pause
goto :eof

:processFirstLine
@echo.
@echo FILE:    %1

dir "%~f1" | find "<SYMLINK>" >NUL && (
  @echo FILE already is a symlink
  goto :eof
)

for /f "usebackq tokens=*" %%l in ("%~f1") do (
  @echo LINK TO: %%l

  del "%~f1"
  if not !ERRORLEVEL! == 0 (
    @echo FAILED: del
    goto :eof
  )

  setlocal
  call :expandRelative linkto "%1" "%%l"
  mklink "%~f1" "!linkto!"
  endlocal
  if not !ERRORLEVEL! == 0 (
    @echo FAILED: mklink
    @echo reverting deletion...
    git checkout -- "%~f1"
    goto :eof
  )

  git update-index --assume-unchanged "%1"
  if not !ERRORLEVEL! == 0 (
    @echo FAILED: git update-index --assume-unchanged
    goto :eof
  )
  @echo SUCCESS
  goto :eof
)
goto :eof

:: param1 = result variable
:: param2 = reference path from which relative will be resolved
:: param3 = relative path
:expandRelative
  pushd .
  cd "%~dp2"
  set %1=%~f3
  popd
goto :eof

Belgelenmemiş bir cevap, zaten bu kadar uzun ve ayrıntılı cevaplar olduğunda çok fazla kullanılmaz.
Xennex81

4

Her zaman belge kök ve git repo dizini arasında sym bağlantılar kullanın. Onları ayrı tutmayı seviyorum. Windows'ta mklink / j seçeneğini kullanıyorum. Kavşak git'in normal davranmasına izin veriyor gibi görünüyor:

>mklink /j <location(path) of link> <source of link>

Örneğin:

>mklink /j c:\gitRepos\Posts C:\Bitnami\wamp\apache2\htdocs\Posts


2
Windows Gezgini ve kavşaklara çok dikkat edin; temel konumdan kavşakları ayırmaz ve bir silme hedefe geri döner ve içeriğini siler, oysa bir sembolik bağın silinmesi sadece sembolik bağlantıyı kaldırır. Sadece ihtiyatsız bir tuzak.
Lawrence Dol

5
Aslında, bunu en son Windows7'de test ettik ve artık yapmıyor, bu nedenle kavşakların kullanımı son birkaç yılda iyileştirildi.
Lawrence Dol

3

Windows üzerindeki unix sembolik bağlantılarıyla başa çıkmak için kolay bir çözüm arıyordum. Yukarıdaki Git takma adları için çok teşekkür ederim. Diğer adın yanlışlıkla çalıştırılması durumunda hedef klasördeki dosyaları silmemesi için rm bağlantılarına yapılabilecek küçük bir optimizasyon vardır. Mantık çalıştırılmadan önce dosyanın zaten bir dizine bağlantı olmadığından emin olmak için lütfen döngüdeki yeni if ​​koşuluna bakın.

git config --global alias.rm-symlinks '!__git_rm_symlinks(){
for symlink in $(git ls-files -s | egrep "^120000" | cut -f2); do
    *if [ -d "$symlink" ]; then
      continue
    fi*
    git rm-symlink "$symlink"
    git update-index --assume-unchanged "$symlink"
done
}; __git_rm_symlinksenter 

2

Kullandığımız basit bir numara, git add --allarka arkaya iki kez aramaktır.

Örneğin, Windows 7 yürütme komut dosyası çağrılarımız:

$ git add --all
$ git add --all

İlk ekleme, bağlantıya metin olarak davranır ve silinecek klasörleri ekler.

İkinci ekleme, bağlantıyı doğru bir şekilde gezer ve dosyaları geri yükleyerek silme işlemini geri alır.

Önerilen diğer çözümlerden daha az zariftir, ancak sembolik bağlantıları ekleyen eski ortamlarımızdan bazıları için basit bir çözümdür.

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.