विंडोज में सिम साइंलिंक


246

हमारे डेवलपर्स विंडोज और यूनिक्स आधारित ओएस के मिश्रण का उपयोग करते हैं। इसलिए, यूनिक्स मशीनों पर बनाए गए सीमलिंक विंडोज डेवलपर्स के लिए एक समस्या बन जाते हैं। विंडोज़ (एमएसआईसिट्ज) में, सिमिलिंक को एक पाठ फ़ाइल में एक पथ के साथ परिवर्तित किया जाता है जिस फ़ाइल को वह इंगित करता है। इसके बजाय, मैं सिम्लिंक को एक वास्तविक विंडोज सिमलिंक में बदलना चाहता हूं।

मेरे पास इसका ( अद्यतन ) समाधान है:

  • एक पोस्ट-चेकआउट स्क्रिप्ट लिखें, जो "सिमलिंक" टेक्स्ट फ़ाइलों की पुनरावृत्ति करेगा।
  • डमी "सिम्कलिन" के रूप में एक ही नाम और विस्तार के साथ उन्हें विंडोज़ सिम्लिंक (mklink का उपयोग करके) से बदलें
  • .गित / जानकारी / बहिष्करण में प्रविष्टि जोड़कर इन विंडो सिम्लिंक को अनदेखा करें

मैंने इसे लागू नहीं किया है, लेकिन मेरा मानना ​​है कि यह इस समस्या के लिए एक ठोस दृष्टिकोण है।

प्रशन:

  1. क्या, यदि कोई है, तो क्या आप इस दृष्टिकोण को देखते हैं?
  2. क्या यह पोस्ट-चेकआउट स्क्रिप्ट भी लागू करने योग्य है? यानी मैं पुन: पता लगा सकता हूँ कि डमी "सिमलिंक" फाइल जीआईटी बनाता है?
  3. क्या किसी ने पहले से ही ऐसी स्क्रिप्ट पर काम किया है?

3
हालाँकि Git सहानुभूति का समर्थन करता है, मैं दृढ़ता से उन्हें आपके भंडार में लिंक के रूप में संग्रहीत करने की सलाह दूंगा, खासकर यदि आप विंडोज पर उस कोड के साथ भी काम कर रहे हैं।
ग्रेग हेविल

2
@ ग्रेग हेगिल - मैं आपसे पूरी तरह सहमत हूँ। दुर्भाग्य से, हमारे कोड आधार की प्रकृति को सहानुभूति की आवश्यकता होती है ... इसलिए उन्हें हटाना हमारे लिए कोई विकल्प नहीं है।
केन हिराकवा

12
आप msysgit मेलिंग सूची पर भी पूछ सकते हैं कि उन्होंने इसे पहले की तरह लागू क्यों नहीं किया।
'50

8
@GregHewgill क्यों नहीं? विंडोज प्रतीकात्मक लिंक और जंक्शन दोनों का समर्थन करता है - यह वास्तव में मुझे Git के विंडोज़ संस्करणों में एक लापता सुविधा की तरह लगता है ...
BrainSlugs83

6
विंडोज 10 में "डेवलपर मोड" सक्षम होने के साथ, सिमिलिंक बनाने के लिए प्रशासक के अधिकारों की आवश्यकता नहीं है! (अन्य लोगों ने कम-वोट वाले उत्तरों पर ज्यादा टिप्पणी की, लेकिन मैंने उन्हें नहीं देखा। यह टिप्पणी भविष्य के पाठकों के लिए अधिक दिखाई देती है।)
डेव पास्कुआ

जवाबों:


105

120000संभवत: इस आदेश के साथ, उन फ़ाइलों की तलाश करके, जो आपके पास एक मोड हैं , सहानुभूति पा सकते हैं :

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

एक बार जब आप लिंक बदल देते हैं, तो मैं उन्हें git update-index --assume-unchangedसूचीबद्ध करने के बजाय उन्हें अपरिवर्तित के रूप में चिह्नित करने की सलाह दूंगा .git/info/exclude


2
मुझे एमएससीजीटी के लिए जाग को प्रतिस्थापित करना था, लेकिन अन्यथा यह पूरी तरह से काम करता था। धन्यवाद!
केन हिराकवा

6
हेलो केन। क्या आप अपनी स्क्रिप्ट साझा करने का मन बना सकते हैं जो सिम्क्लिंक पाठ फ़ाइलों की जांच करती है और उन्हें mklink का उपयोग करके विंडोज़ पर सिम्बलिंक्स के साथ बदल देती है। जबकि यह वास्तव में हमारे लिए काम करता है - घास-अपरिवर्तित हिस्सा नहीं करता है। दूसरी ब्रांच git में स्विच करने पर कहते हैं कि सिम्लिंक फाइलें बदली गई हैं और पहले उन्हें कमिट करने की आवश्यकता है, जबकि git स्टेटस कहता है कि कोई बदलाव नहीं हैं..सभी विचार?
joreg

6
यहाँ एक PowerShell एक है जिसे मैंने एक साथ रखा है - gist.github.com/ferventcoder/7995025
ferventcoder

3
@flungo GNU awk के उपयोग से चौथे कॉलम को प्रिंट करने के अधिक पोर्टेबल तरीके हैं। उदाहरण के लिए: git ls-files -s | grep '^12' | cut -f2(दूसरा टैब-सीमांकित स्तंभ; अन्य कॉलम स्पेस-सीमांकित हैं)
Zenexer

1
Cygwin / bash के लिए एक लाइनर सभी सिमलिंक चिह्नित करने के लिए कोई परिवर्तन नहीं:for f in `git ls-files -s | awk '/120000/{print $4}'`; do git update-index --assume-unchanged $f; done
DaveAlden

187

मैं थोड़ी देर पहले यही सवाल पूछ रहा था (यहाँ नहीं, बस सामान्य रूप से) और ओपी के प्रस्ताव के समान समाधान के साथ आ रहा था। पहले मैं प्रश्न 1 2 और 3 के सीधे उत्तर प्रदान करूंगा, और फिर मैं उस समाधान को पोस्ट करूंगा जिसका मैंने उपयोग किया था।

  1. प्रस्तावित समाधान के लिए वास्तव में कुछ डाउनसाइड्स हैं, मुख्य रूप से रिपॉजिटरी प्रदूषण के लिए एक बढ़ी हुई क्षमता के बारे में, या गलती से डुप्लिकेट फ़ाइलों को जोड़ने के दौरान वे अपने "विंडोज सिमिलिंक" राज्यों में हैं। (नीचे "सीमाओं" के तहत इस पर अधिक)
  2. हां, पोस्ट-चेकआउट स्क्रिप्ट लागू करने योग्य है! शायद शाब्दिक पद के रूप में नहीं-git checkout स्टेप के , लेकिन नीचे दिए गए समाधान ने मेरी आवश्यकताओं को अच्छी तरह से पूरा किया है कि एक शाब्दिक पोस्ट-चेकआउट स्क्रिप्ट आवश्यक नहीं थी।
  3. हाँ!

समाधान:

हमारे डेवलपर्स ओपी के समान स्थिति में हैं: विंडोज और यूनिक्स जैसे मेजबानों, रिपॉजिटरी और सबमॉडल्स का मिश्रण, जिसमें कई जीआईटी सिम्लिंक हैं, और एमएसजीगिट के रिलीज संस्करण में कोई देशी समर्थन (अभी तक) नहीं है, जो बुद्धिमान रूप से विंडोज होस्ट पर इन सिमलिंक को संभाल रहा है। ।

इस तथ्य को इंगित करने के लिए जोश ली के लिए धन्यवाद कि गिट विशेष फिल्ममोड के साथ सहानुभूति रखता है 120000। इस जानकारी के साथ कुछ गीट एलियास जोड़ना संभव है जो विंडोज मेजबानों पर गिट सिमिलिंक के निर्माण और हेरफेर की अनुमति देता है।

  1. विंडोज पर जीआईटी सिम्लिंक बनाना

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

    उपयोग: git add-symlink <source_file_or_dir> <target_symlink>जहां स्रोत फ़ाइल या निर्देशिका के अनुरूप तर्क को लक्ष्य सिम्लिंक के सापेक्ष पथ का रूप लेना चाहिए आप इस उपनाम का उपयोग उसी तरह कर सकते हैं जिस तरह से आप सामान्य रूप से करते हैं ln

    जैसे, रिपॉजिटरी ट्री:

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

    विंडोज पर निम्नानुसार बनाया जा सकता है:

    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 हार्डलिंक्स + जंक्शनों के साथ git सिम्लिंक्स को बदलना

    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.
    

    उपयोग:

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

    यह उपनाम एक-एक करके एक-एक करके गिरे हुए सहवास को हटा सकता है। Symlinks को NTFS हार्डलिंक (फ़ाइलों के मामले में) या NTFS जंक्शन (निर्देशिकाओं के मामले में) से बदला जाएगा। "सही" NTFS सिमिलिंक पर हार्डलिंक + जंक्शनों का उपयोग करने का लाभ यह है कि इन्हें बनाने के लिए उन्नत UAC अनुमतियों की आवश्यकता नहीं होती है।

    सबमॉड्यूल्स से सीमलिंक को हटाने के लिए, बस उन पर चलने के लिए गिट के अंतर्निहित समर्थन का उपयोग करें:

    git submodule foreach --recursive git rm-symlinks
    

    लेकिन, इस तरह की हर कठोर कार्रवाई के लिए, एक उलटफेर अच्छा है ...

  3. Windows पर गिट सिम्बल को पुनर्स्थापित करना

    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'
    

    उपयोग: git checkout-symlinks [symlink] [symlink] [...]जो पूर्ववत करता है git rm-symlinks, प्रभावी ढंग से भंडार को अपनी प्राकृतिक स्थिति (आपके परिवर्तनों को छोड़कर) को बहाल करता है, जिसे करना चाहिए बरकरार रहना ) को करता है।

    और सबमॉड्यूल्स के लिए:

    git submodule foreach --recursive git checkout-symlinks
    
  4. सीमाएं:

    • उनके पथ में रिक्त स्थान के साथ निर्देशिकाएँ / फाइलें / सहानुभूति काम करना चाहिए। लेकिन टैब या न्यूलाइन्स? YMMV… (इससे मेरा मतलब है: ऐसा मत करो, क्योंकि यह काम नहीं करेगा ।)

    • यदि स्वयं या अन्य git checkout-symlinksसंभावित व्यापक व्यापक परिणामों के साथ कुछ करने से पहले भूल जाते हैं git add -A, तो स्थानीय भंडार प्रदूषित अवस्था में समाप्त हो सकता है

      पहले से हमारे "उदाहरण रेपो" का उपयोग करना:

      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
      #
      

      ओह ...

      इस कारण से, इन उपनामों को विंडोज उपयोगकर्ताओं के लिए प्रदर्शन करने के चरणों के रूप में शामिल करना अच्छा है, परियोजना के निर्माण से पहले और बाद में चेकआउट के बाद या धक्का देने से पहले। लेकिन हर स्थिति अलग है। ये उपनाम मेरे लिए काफी उपयोगी रहे हैं कि एक सही पोस्ट-चेकआउट समाधान आवश्यक नहीं है।

उम्मीद है की वो मदद करदे!

संदर्भ:

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

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

अंतिम अपडेट: 2019-03-13

  • POSIX अनुपालन (अच्छी तरह से, उन mklinkकॉलों को छोड़कर , निश्चित रूप से) - अब और नहीं बशीज़ !
  • निर्देशिकाएँ और उनमें रिक्त स्थान वाली फाइलें समर्थित हैं।
  • शून्य और गैर-शून्य निकास स्थिति कोड (क्रमशः अनुरोधित आदेश की सफलता / विफलता को संप्रेषित करने के लिए) अब ठीक से संरक्षित / वापस आ गए हैं।
  • add-symlinkउर्फ अब और अधिक की तरह काम करता ln (1) और भंडार में किसी भी निर्देशिका ही नहीं, भंडार के रूट निर्देशिका से इस्तेमाल किया जा सकता।
  • rm-symlinkउर्फ (एकवचन) ने ले लिया है rm-symlinksचुनिंदा NTFS hardlinks + जंक्शनों में Git सिमलिंक बदलने के लिए उर्फ (बहुवचन) है, जो अब कई तर्क स्वीकार करता है (या फिर कोई तर्क है, जो भंडार भर सिमलिंक के सभी पाता, इससे पहले के रूप में) ।
  • checkout-symlinksउर्फ भी कई तर्क स्वीकार करने के लिए अद्यतन किया गया है (सब पर या बिल्कुल भी नहीं, सब कुछ ==) ऊपर उल्लिखित परिवर्तनों के चुनिंदा उत्क्रमण के लिए।

अंतिम नोट: जबकि मैंने बैश 3.2 (और यहां तक ​​कि 3.1) का उपयोग करके इन उपनामों को लोड करने और चलाने का परीक्षण किया था, जो अभी भी किन्हीं भी कारणों से ऐसे प्राचीन संस्करणों पर अटक सकते हैं, ध्यान रहे कि संस्करण जितने पुराने हैं उतने ही उनके पार्सर के लिए कुख्यात हैं कीड़े। यदि आप इनमें से किसी भी उपनाम को स्थापित करने की कोशिश करते समय समस्याओं का अनुभव करते हैं, तो पहली चीज जिसे आपको देखना चाहिए वह है अपने शेल को अपग्रेड करना (बैश के लिए, CTRL + X, CTRL + V के साथ संस्करण की जांच करना)। वैकल्पिक रूप से, यदि आप उन्हें अपने टर्मिनल एमुलेटर में चिपकाकर उन्हें स्थापित करने की कोशिश कर रहे हैं, तो आपके पास एक फ़ाइल में उन्हें पेस्ट करने और इसके बजाय इसे सोर्स करने के लिए अधिक भाग्य हो सकता है, जैसे कि।

. ./git-win-symlinks.sh

सौभाग्य!


क्या आप कृपया इसे यहाँ देख सकते हैं? stackoverflow.com/questions/21403772/…
नासमझ

यह एक महान और अद्भुत स्क्रिप्ट है, लेकिन क्या इसका कोई कारण है कि मुझे अपनी कुछ फाइलों के अंत में "git" शब्द को बेतरतीब ढंग से चिपका देना चाहिए जो मैं git ऐड-सिमलिंक के साथ बनाता हूं?
पीटर टर्नर

इसके अलावा, यदि आपके फ़ाइल नाम में "-ह" है तो आपको उपयोग मिल जाएगा। अभी भी बहुत उपयोगी स्क्रिप्ट!
पीटर टर्नर

आपका git add-symlinkनुस्खा मेरे लिए काल्पनिक रूप से मूल्यवान रहा है। बहुत धन्यवाद।
डैन लेन्स्की

1
क्या हुक का उपयोग करके इन लिपियों को स्वचालित रूप से निष्पादित करने का कोई तरीका है?
एआरएफ

74

Git scm (testet 2.11.1) का सबसे हालिया संस्करण प्रतीकात्मक लिंक को सक्षम करने की अनुमति देता है। लेकिन आपको रिपॉजिटरी को फिर से सिमलिंक के साथ क्लोन करना होगा git clone -c core.symlinks=true <URL>। आपको इस आदेश को व्यवस्थापक अधिकारों के साथ चलाने की आवश्यकता है। यह भी संभव है कि विंडोज पर mklink के साथ सीलिंक बनाया जाए। विकी बाहर की जाँच करें ।

यहां छवि विवरण दर्ज करें


1
यह मेरे लिए काम नहीं किया। मैंने विंडोज के लिए जीआईटी को फिर से स्थापित किया, याद रखें कि सिमलिंक चेकबॉक्स की जांच करें और मेरे प्रोजेक्ट को फिर से क्लोन करें। tslint.jsonपैरेंट डायरेक्टरी में फाइल को संदर्भित करने वाली मेरी फाइल में अभी भी शामिल है ../tslint.json। अफ़सोस, क्योंकि यह वास्तव में वहाँ प्रस्तावित सभी समाधानों में से सबसे आसान लग रहा था।
Jan Aagard

8
@JanAagard आपको इसे इस तरह से क्लोन करना होगा: git clone -c core.symlinks=true <URL> और विंडोज पर आपको इसे व्यवस्थापक अधिकारों के साथ चलाना होगा।
sirlunchalot

6
@ARF "gpedit.msc (अर्थात समूह नीति संपादक) लॉन्च करें और खाता (ओं) को कंप्यूटर कॉन्फ़िगरेशन \ Windows सेटिंग \ सुरक्षा सेटिंग्स \ स्थानीय नीतियों \ उपयोगकर्ता अधिकारों असाइनमेंट \" के लिए प्रतीकात्मक लिंक जोड़ें। "
sirlunchalot

2
@sirlunchalot मदद के लिए धन्यवाद। मुझे तब से एहसास हुआ है कि मेरी समस्या यह है कि मेरा उपयोगकर्ता प्रशासक समूह का हिस्सा है और इस संपत्ति का इन उपयोगकर्ताओं के लिए कोई प्रभाव नहीं है। उन्हें यूएसी ऊंचाई की आवश्यकता होती है जो गिट नहीं करता है।
एआरएफ

9
विंडोज 10 क्रिएटर्स अपडेट में "डेवलपर मोड" में व्यवस्थापक अधिकार आवश्यक नहीं हैं । धन्यवाद @ डेनिस ने अपनी टिप्पणी में
डोमिनिक १

16

यह msysgit में लागू किया जाना चाहिए, लेकिन दो डाउनसाइड हैं:

  • प्रतीकात्मक लिंक केवल विंडोज विस्टा और बाद में उपलब्ध हैं (2011 में एक मुद्दा नहीं होना चाहिए, और अभी तक यह है ...), क्योंकि पुराने संस्करण केवल निर्देशिका जंक्शनों का समर्थन करते हैं।
  • (बड़ा वाला) Microsoft प्रतीकात्मक लिंक को एक सुरक्षा जोखिम मानता है और इसलिए केवल प्रशासक उन्हें डिफ़ॉल्ट रूप से बना सकते हैं। आपको इस प्रक्रिया के विशेषाधिकारों को बढ़ाना होगा या आपके द्वारा काम करने वाली प्रत्येक मशीन पर इस व्यवहार को बदलने के लिए fstool का उपयोग करना होगा।

मैंने एक त्वरित खोज की और इस पर सक्रिय रूप से काम किया जा रहा है, देखें मुद्दा 224


2
अद्यतन: उपरोक्त कारणों से, इस मुद्दे को wontfix के रूप में बंद कर दिया गया था। चर्चा इंगित करती है कि पैच पर कुछ और काम के साथ एक फिक्स को स्वीकार किया जा सकता है (कहते हैं, केवल सहकर्मियों का उपयोग करते हुए अगर वे काम करते हैं)।
ब्लिसॉर्बलेड

2
ए) वर्तमान में msysgit सबलिंक का समर्थन नहीं करता है - तो इसका पता क्यों नहीं है "ओह आप NTFS के साथ विस्टा पर हैं मुझे" सहानुभूति का उपयोग करने दें "या" ओह, आप एक ओएस पर हैं जो NTFS के साथ जंक्शनों का समर्थन करता है, " मुझे उन का उपयोग करने दें ", या" ओह, आप विंडोज 98 / fat32 पर हैं, मुझे केवल इस सुविधा के नहीं होने और इसके बजाय आपको चेतावनी देने के लिए वापस जाने दो! " और फिर बी।) बहुत सारे माइक्रोसॉफ्ट के देव के। यदि आप उन्हें व्यवस्थापक के रूप में नहीं चलाते हैं, तो उपकरण सही तरीके से काम नहीं करते हैं (कम से कम उनकी सभी विशेषताओं के लिए) - आईटी में हर कोई जानता है कि डेवलपर्स को अपने स्वयं के बक्से पर प्रवेश की आवश्यकता होती है।
ब्रेनस्ल्गस83

1
जब मैं व्यवस्थापक खाते में कुछ मशीनें चलाता हूं, तो मैं अपने विकास मशीन पर उस दर्शन का पालन नहीं करता। मैं हमेशा यूएसी-सक्षम के साथ एक नियमित उपयोगकर्ता के रूप में चलता हूं। मैं उन ऑपरेशंस के लिए अलग कंसोल ओपन रखता हूं, जिन्हें एलिवेटेड विशेषाधिकार की आवश्यकता होती है। इसे कार्यान्वित करने के लिए, इसे लागू करने के लिए किसी (आप जैसे) के लिए स्वेच्छा से नीचे आना चाहिए। Msysgit डेवलपर्स चैरिटी के लिए नहीं जाने जाते ...
djs

@djs A उपयोगकर्ता को "Run as Administrator" के साथ कमांड प्रॉम्प्ट खोलना होगा। यह लगभग शाब्दिक रूप से प्रशासक उपयोगकर्ता के रूप में चल रहा है जो पूरी तरह से पर्यावरण को बदलता है। उपयोगकर्ता के रूप में 'mklink / d' को चलाने का कोई तरीका नहीं है जो व्यवस्थापक समूह में भी है। यह UAC संकेत नहीं देगा। यह विफल हो जाएगा, हमेशा। केवल दो तरीके से यह काम करता है: वास्तव में प्रशासक उपयोगकर्ता (रनएब वर्ब), या समूह नीति परिवर्तन के साथ एक गैर-व्यवस्थापक उपयोगकर्ता के रूप में। जंक्शन डिफ़ॉल्ट होने चाहिए और सभी उपकरणों द्वारा मान्यता प्राप्त होनी चाहिए। 'सुरक्षा जोखिम' यह है कि विंडोज पर सहानुभूति एसबीएम शेयरों को 'पुनर्निर्देशित' कर सकती है। यह एक दर्द और क्रूर है।
एंड्रयू टी फिननेल

8
दिसंबर 2016 की घोषणा की, विंडोज 10 में Symlinks अब एक प्रशासक कार्रवाई नहीं है। blogs.windows.com/buildingapps/2016/12/02/symlinks-windows-10/…
डेनिस

16

जीआईटी के साथ चीजें बदल गई हैं क्योंकि इन जवाबों में से एक को यहां पोस्ट किया गया था, खिड़कियों में सही तरीके से काम करने वाले सिर्लिंक प्राप्त करने के लिए सही निर्देश हैं।

अगस्त 2018


1. सुनिश्चित करें कि git को सिमलिंक समर्थन के साथ स्थापित किया गया है

खिड़कियों पर गिट की स्थापना के दौरान

2. बैश को सिम्बलिंक के बजाय हार्डलिंक बनाने के लिए कहें

EDIT - (git फ़ोल्डर) /etc/bash.bashrc

BOTTOM में जोड़ें - MSYS=winsymlinks:nativestrict

3. सिमिलिंक का उपयोग करने के लिए git config सेट करें

git config core.symlinks true

या

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

नोट: मैंने इसे वैश्विक git config में जोड़ने की कोशिश की है और फिलहाल यह मेरे लिए काम नहीं कर रहा है इसलिए मैं इसे प्रत्येक प्रतिनिधि के साथ जोड़ने की सलाह देता हूं ...

4. रेपो खींचो

नोट: जब तक आपने विंडोज 10 के नवीनतम संस्करण में डेवलपर मोड को सक्षम नहीं किया है, तो आपको सिम्बल बनाने के लिए व्यवस्थापक के रूप में बैश चलाने की आवश्यकता है

5. सभी सिमिलिंक को रीसेट करें (वैकल्पिक) यदि आपके पास एक मौजूदा रेपो है, या आप सबमोडुल्स का उपयोग कर रहे हैं, तो आप पा सकते हैं कि सिम्बलिंक को सही ढंग से नहीं बनाया जा रहा है ताकि रेपो में मौजूद सभी सिमलिंक को ताज़ा करने के लिए आप इन कमांडों को चला सकें।

find -type l -delete
git reset --hard

नोट: यह अंतिम परिवर्तन के बाद से किसी भी परिवर्तन को रीसेट कर देगा इसलिए सुनिश्चित करें कि आपने पहले किया है


15

संक्षिप्त उत्तर: वे अब अच्छी तरह से समर्थित हैं, यदि आप डेवलपर मोड को सक्षम कर सकते हैं।

से https://blogs.windows.com/buildingapps/2016/12/02/symlinks-windows-10/

अब विंडोज 10 क्रिएटर्स अपडेट में, एक उपयोगकर्ता (व्यवस्थापक अधिकारों के साथ) पहले डेवलपर मोड को सक्षम कर सकता है, और फिर मशीन पर कोई भी उपयोगकर्ता कमांड लाइन कंसोल को ऊंचा किए बिना mklink कमांड चला सकता है।

यह बदलाव क्या हुआ? सीमलिंक की उपलब्धता और उपयोग आधुनिक डेवलपर्स के लिए एक बड़ी बात है:

कई लोकप्रिय विकास उपकरण जैसे git और पैकेज मैनेजर जैसे npm पहचानते हैं और क्रमशः रिपोज या पैकेज बनाते समय सहानुभूति को बनाए रखते हैं। जब उन रिपोज या पैकेजों को फिर से कहीं और बहाल किया जाता है, तो डिस्क स्थान (और उपयोगकर्ता का समय) बर्बाद नहीं होता है, यह सुनिश्चित करता है कि सिम्लिंक भी बहाल हो जाते हैं।

"निर्माता के अपडेट" की अन्य सभी घोषणाओं की अनदेखी करना आसान है, लेकिन यदि आप डेवलपर मोड को सक्षम करते हैं, तो आप उन्नत विशेषाधिकार के बिना सहानुभूति बना सकते हैं। आपको गिट को फिर से स्थापित करना पड़ सकता है और सुनिश्चित करें कि सहानुभूति समर्थन सक्षम है, क्योंकि यह डिफ़ॉल्ट रूप से नहीं है।

डिफ़ॉल्ट रूप से प्रतीकात्मक लिंक सक्षम नहीं हैं


1
gpedit.msc-> Local Computer Policy-> Computer Configuration-> Windows Settings-> Security Settings-> Local Policies-> उम्र के लिए और दोस्तों की User Rights Assignmentतरह उपयोगकर्ता अधिकार प्रदान करने के लिए विहित तरीका SeCreateSymbolicLinkरहा है। के अलावा अन्य ntrights.exeसंसाधन किट या PowerShell ... से
0xC0000022L

11

2020 उत्तर

  1. विंडोज 10 में "डेवलपर मोड" सक्षम करें - mklinkअनुमति देता है
  2. सुनिश्चित करें कि सहानुभूति गिट में सक्षम हैं
    • git config --global core.symlinks true
    • या msysgit स्थापित करते समय चेकबॉक्स की जांच करें

स्विचिंग शाखाएँ गुम सीमलिंक के मनोरंजन को मजबूर करेंगी।

सावधान रहें, कुछ अन्य Git क्लाइंट के साथ Windows पर Symlinks के लिए समर्थन पूर्ण नहीं है। विशेष रूप से GitKraken।


मेरे सभी स्थानीय रिपॉजिटरी में core.symlinks = false है जो आपके समाधान को ओवरराइड करेगा। कोई भी विचार जो इस स्थानीय विन्यास को स्वतः उत्पन्न कर रहा है? संभवतः चेकबॉक्स की जांच के बिना विंडोज के लिए गिट स्थापित करना?
gravidThoughts

@ gravidThoughts जो आपने क्लाइंट को स्थापित किया है? शायद कुछ टूलींग यह कर रहा है? क्या यह एक ताजा क्लोन पर सच है?
कैमरन टैकलिंड

10

मैं आपको सुझाव दूंगा कि आप रेपो के भीतर सिमिलिंक का उपयोग न करें। ' रेपो के अंदर वास्तविक सामग्री को संग्रहित करें 'और फिर सिंप्लिंक्स को रेपो की तरफ रखें' जो कि सामग्री की ओर इशारा करता है।

तो चलिए बताते हैं कि आप अपनी साइट को होस्टिंग पर तुलना करने के लिए 'निक्स' का इस्तेमाल कर रहे हैं। सामग्री को अपने रेपो में संग्रहीत करें ', कहने दें /httpRepoContentऔर इसके c:\httpRepoContentसाथ वह फ़ोल्डर है जो GIT, SVN आदि के माध्यम से समन्वयित है।

फिर, आप अपने वेब सर्वर के कंटेंट फोल्डर को बदलें ( /var/wwwऔर c:\program files\web server\www{नाम वास्तव में मायने नहीं रखते हैं, अगर आपको चाहिए तो संपादित करें)) आपके रेपो में सामग्री के प्रतीकात्मक लिंक के साथ। वेब सर्वर सामग्री को वास्तव में 'सही' जगह पर देखेंगे, लेकिन आपको अपने स्रोत नियंत्रण का उपयोग करना होगा।

हालाँकि, यदि आपको रेपो में सिम्बलिंक का उपयोग करने की आवश्यकता है, तो आपको कुछ प्रकार की पूर्व / पोस्ट स्क्रिप्ट की तरह देखने की आवश्यकता होगी। मुझे पता है कि आप उन्हें चीजों को करने के लिए उपयोग कर सकते हैं, जैसे कि उदाहरण के लिए एक फ़ॉर्मेटर के माध्यम से कोड फ़ाइलों को पार्स करें, इसलिए प्लेटफार्मों के बीच सहानुभूति को परिवर्तित करना संभव होना चाहिए।

यदि कोई भी सामान्य स्रोत नियंत्रण, एसवीएन जीआईटी एमजी के लिए इन लिपियों को करने का तरीका जानने के लिए एक अच्छी जगह जानता है, तो कृपया एक टिप्पणी जोड़ें।


अंत में, मैंने एक सिम्लिंक-आउट फ़ोल्डर बनाने के लिए और जहाँ मूल फ़ाइल हुआ करती थी, प्रतीकात्मक लिंक बनाने के लिए इस दृष्टिकोण को चुना। मेरे द्वारा बदल दिए जाने के बाद भी अन्य दृष्टिकोण काम नहीं किया। कोस्टर / कॉन्फ़िगरेशन सेटिंग core.symlinks = true। केवल प्रतीकात्मक लिंक फ़ाइल को रेपो में सहेजा गया था न कि डेटा को। इसके अलावा सांकेतिक लिंक पर फ़ोल्डर टाइमस्टैम्प के साथ समस्याएं थीं, इसलिए git bash ने कभी नहीं देखा जब फ़ोल्डर के भीतर एक फ़ाइल बदल गई।
अंडे

@ आप जो देख रहे होंगे, मुझे लगता है, मुझे लगता है कि लिंक रेपो के भीतर था, और इस तरह इसे सहेजा गया है, सिम्पल। हालांकि समस्या यह है कि लक्ष्य रेपो के बाहर था, और गिट लक्ष्य डेटा के लिंक का पालन नहीं करता है। लिनक्स पर आपके पास एक प्रकार का लिंक है जो इसके लिए काम करेगा, यह मूल रूप से है कि आपके पास डिस्क पर संग्रहीत एक ही डेटा के दो रास्ते हैं; मुझे लग रहा है कि newish विंडो अब यह कर सकती है। किसी भी तरह से हालांकि, मुझे अभी भी नहीं लगता कि यह वह करने जा रहा है जो लोग चाहते हैं।
Thecoshman

@thecoshman यह एक समाधान नहीं है, बल्कि एक समाधान है। हालांकि, कभी-कभी यह एक विकल्प नहीं है। मेरे पास प्रतीकात्मक लिंक के कारण git-annex के साथ एक भंडार है।
marcelo.guedes

8

Vista, Win7, या इसके बाद के संस्करण पर CygWin का उपयोग करने वालों के लिए , देशी gitकमांड "उचित" सिम्लिंक बना सकती है जो एंड्रॉइड स्टूडियो जैसे विंडोज ऐप द्वारा मान्यता प्राप्त हैं । आपको बस शामिल करने के लिए CYGWINपर्यावरण चर सेट करने की आवश्यकता है winsymlinks:nativeया winsymlinks:nativestrictजैसे:

export CYGWIN="$CYGWIN winsymlinks:native"

इस के लिए नकारात्मक पहलू (और उस पर एक महत्वपूर्ण) यह है कि CygWin शेल को "Run as Administrator" के रूप में होना चाहिए ताकि इसके लिए OS अनुमतियों के लिए उन प्रकार के सीमलिंक बनाने की आवश्यकता हो। एक बार जब वे बन जाते हैं, हालांकि, उनका उपयोग करने के लिए कोई विशेष अनुमति की आवश्यकता नहीं होती है । जब तक वे दूसरे डेवलपर द्वारा रिपॉजिटरी में नहीं बदले जाते हैं, तब gitतक सामान्य उपयोगकर्ता अनुमतियों के साथ ठीक चलता है।

व्यक्तिगत रूप से, मैं इसका उपयोग केवल उन सीमलिंक के लिए करता हूं जो इस अतिरिक्त कठिनाई के कारण विंडोज ऐप्स (यानी गैर-साइगविन) द्वारा नेविगेट किए जाते हैं।

इस विकल्प की अधिक जानकारी के लिए, यह SO प्रश्न देखें: विंडोज 7 में साइबरविन के साथ प्रतीकात्मक संबंध कैसे बनाएं


6

यहाँ जोश ली के उत्तर के आधार पर, केवल फाइलों में, रिपॉजिटरी में सिम्लिंक परिवर्तित करने के लिए एक बैच स्क्रिप्ट है। व्यवस्थापक अधिकारों के लिए कुछ अतिरिक्त जांच वाली स्क्रिप्ट https://gist.github.com/Quazistax/8daf09080bf54b4c7641 पर है

@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

जब पहले से ही इतने लंबे और वर्बोज़ जवाब मौजूद हों, तो एक अनकंफर्टेबल जवाब बहुत ज्यादा इस्तेमाल नहीं होता है।
Xennex81

4

मैं अपने दस्तावेज़ रूट और गिट रेपो डायरेक्टरी के बीच हर समय सिम्पल लिंक का उपयोग करता हूं। मैं उन्हें अलग रखना पसंद करता हूं। खिड़कियों पर मैं mklink / j विकल्प का उपयोग करता हूं। ऐसा लगता है कि जंक्शन सामान्य रूप से व्यवहार करने देता है:

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

उदाहरण के लिए:

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


2
विंडोज एक्सप्लोरर और जंक्शनों के साथ बहुत सावधान रहें; यह बेस लोकेशन से जंक्शनों को अलग नहीं करता है और एक डिलीट टारगेट में फिर से आ जाएगा और यह कंटेंट डिलीट कर देगा, जबकि एक सिमलिंक को डिलीट करने से सिम्बल हट जाएगा। अनजाने के लिए बस एक जाल।
लॉरेंस Dol

5
दरअसल, विंडोज 7 के लेटेस्ट पर यह परीक्षण किया गया था, और यह अब ऐसा नहीं करता है, इसलिए पिछले कुछ वर्षों में जंक्शनों की हैंडलिंग में कुछ सुधार हुआ है।
लॉरेंस Dol

3

मैं विंडोज़ पर यूनिक्स प्रतीकात्मक लिंक से निपटने के लिए एक आसान समाधान की तलाश में था। उपरोक्त गिट उपनाम के लिए बहुत बहुत धन्यवाद। एक छोटा सा अनुकूलन है जो rm-symlinks को किया जा सकता है ताकि यह गंतव्य फ़ोल्डर में मौजूद फ़ाइलों को डिलीट न कर सके, जब उपनाम दूसरी बार गलती से चला गया हो। कृपया यह सुनिश्चित करें कि लॉजिक को चलाने से पहले फाइल को एक डायरेक्टरी से लिंक न किया जाए, यह सुनिश्चित करने के लिए लूप में कंडीशन देखें।

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

एक सरल ट्रिक जो हम उपयोग करते हैं वह है सिर्फ git add --allएक पंक्ति में दो बार कॉल करना ।

उदाहरण के लिए, हमारी विंडोज 7 प्रतिबद्ध स्क्रिप्ट कॉल:

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

पहला ऐड लिंक को टेक्स्ट की तरह मानता है और डिलीट के लिए फोल्डर जोड़ता है।

दूसरा ऐड सही तरीके से लिंक को ट्रेस करता है और फाइलों को रिस्टोर करके डिलीट को हटा देता है।

यह कुछ अन्य प्रस्तावित समाधानों की तुलना में कम सुरुचिपूर्ण है, लेकिन यह हमारे कुछ विरासत वाले वातावरणों के लिए एक सरल समाधान है, जिन्हें सहानुभूति मिला।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.