programing

Windows의 Git 심볼릭 링크

telebox 2023. 5. 7. 11:21
반응형

Windows의 Git 심볼릭 링크

개발자들은 Windows와 Unix 기반 OS를 혼합하여 사용합니다.따라서 유닉스 시스템에 생성된 심볼릭 링크는 윈도우즈 개발자들에게 문제가 됩니다.Windows(MSysGit)에서는 심볼릭 링크가 가리키는 파일의 경로를 가진 텍스트 파일로 변환됩니다.대신 심볼릭 링크를 실제 Windows 심볼릭 링크로 변환하고 싶습니다.

이에 대한 (업데이트된) 솔루션은 다음과 같습니다.

  • "상징 링크" 텍스트 파일을 재귀적으로 찾는 체크아웃 후 스크립트를 작성합니다.
  • 더미 "상징 링크"와 이름과 확장자가 동일한 Windows 심볼릭 링크(mklink 사용)로 대체합니다.
  • .git/info/exclude 파일에 항목을 추가하여 이러한 윈도우즈 심볼 링크를 무시합니다.

저는 이것을 구현하지 않았지만, 이것이 이 문제에 대한 확실한 접근이라고 믿습니다.

  1. 이 접근법의 단점은 무엇이라고 생각하십니까?
  2. 체크아웃 후 스크립트를 구현할 수 있습니까?즉, Git이 생성하는 더미 "symlink" 파일을 재귀적으로 찾을 수 있습니까?

노트 업데이트

심볼릭 링크와 관련하여 어려움을 겪고 있는 대부분의 Windows 개발자들에게git및 *시스템과이입니다. Windows에 대한 이해를 하면 문제가 해결됩니다. Windows에 대한 이해를 업데이트하면mklink개발자 모드를 설정합니다.

다음의 심층적인 Githack 토론을 파고들기 전에 이 보다 현대적인 답변을 확인하십시오.

이전 시스템:

얼마 전에 정확히 같은 질문을 던졌는데(일반적으로 여기가 아니라) 결국 OP의 제안과 매우 유사한 해결책을 생각해냈습니다.제가 사용하게 된 솔루션을 게시하겠습니다.

하지만 먼저 OP의 3가지 질문에 대한 직접적인 답변을 드리겠습니다.

Q: "이 접근법의 단점이 있다면 무엇이라고 생각하십니까?"

A: 주로 저장소 오염 가능성이 증가하거나 "Windows symlink" 상태에서 중복 파일을 실수로 추가하는 등 제안된 솔루션에는 몇 가지 단점이 있습니다. (아래 "제한 사항"에 따라 이에 대한 자세한 내용은 다음과 같습니다.)

Q: "이 체크아웃 후 스크립트는 구현 가능합니까? 즉, Git이 생성하는 더미 "symlink" 파일을 재귀적으로 찾을 수 있습니까?"

A: 네, 체크아웃 후 스크립트를 구현할 수 있습니다!아마도 문자 그대로의 포스트로서는 아닐 것입니다.git checkout단계, 하지만 아래 솔루션은 문자 그대로의 사후 스크립트가 필요하지 않을 정도로 제 요구를 잘 충족시켰습니다.

Q: "이미 그런 대본을 작성한 사람이 있습니까?"

A: 네!

솔루션:

개발자들은 운영 체제와 거의 같은 상황에 처해 있습니다. Windows 및 Unix와 유사한 호스트, 많은 Git 심볼 링크가 있는 리포지토리 및 하위 모듈, Windows 호스트에서 이러한 심볼 링크를 지능적으로 처리하기 위한 MsysGit 릴리스 버전에서는 아직 기본 지원이 없습니다.

Git이 특수 파일 모드로 심볼 링크를 커밋한다는 사실을 지적해 준 Josh Lee에게 감사합니다.120000이 정보를 사용하면 Windows 호스트에서 Git 심볼릭 링크를 만들고 조작할 수 있는 몇 가지 Git 별칭을 추가할 수 있습니다.

  1. Windows에서 Git 심볼릭 링크 만들기

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

    다음과 같이 Windows에서 만들 수 있습니다.

     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 심볼릭 링크를 NTFS 하드 링크+접합으로 바꾸기

     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] [...]
    

    이 별칭은 Git 심볼릭 링크를 한 번에 하나씩 또는 한 번에 모두 제거할 수 있습니다.Symlinks는 NTFS 하드 링크(파일의 경우) 또는 NTFS 연결(디렉토리의 경우)로 대체됩니다."진정한" NTFS 심볼릭 링크에 비해 하드링크+접합을 사용할 경우의 이점은 UAC 권한을 높이는 것이 필요하지 않다는 입니다.

    하위 모듈에서 심볼 링크를 제거하려면 Git의 내장 지원 기능을 사용하여 심볼 링크를 반복하십시오.

     git submodule foreach --recursive git rm-symlinks
    

    하지만 이런 극단적인 행동을 할 때마다, 반전이 일어나는 것은 좋은 일입니다.

  3. 윈도우즈에서 Git 심볼릭 링크 복원

     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
      #
      

      이런...

      이러한 이유로 프로젝트를 빌드하기 전과 후에 Windows 사용자가 수행할 수 있는 단계로 이러한 별칭을 포함하는 것이 좋습니다.하지만 각각의 상황은 다릅니다.이러한 별칭은 체크아웃 후 진정한 솔루션이 필요하지 않을 정도로 유용했습니다.

참조:

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

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

최종 업데이트: 2019-03-13

  • ( POSIX 준글수 (요, 외)글) 제외)mklink물론 호출)— 이상 바시즘은 없습니다!
  • 디렉토리 및 공백이 있는 파일이 지원됩니다.
  • 이제 0 및 0이 아닌 종료 상태 코드(요청된 명령의 성공/실패를 각각 전달하기 위한 코드)가 올바르게 보존/반환됩니다.
  • add-symlinkalias는 이제 ln(1)처럼 작동하며 저장소의 루트 디렉터리뿐만 아니라 저장소의 모든 디렉터리에서 사용할 수 있습니다.
  • rm-symlink로 되었습니다.rm-symlinksalias(복수) - 이제 git 심볼릭 링크를 NTFS 하드링크+접합으로 선택적으로 변환하기 위한 여러 인수(또는 이전과 같이 저장소 전체에서 모든 심볼릭 링크를 찾는 인수가 전혀 없음)를 허용합니다.
  • checkout-symlinks별칭도 위에서 언급한 변환의 선택적 반전을 위한 다중 인수(또는 전혀 없음, == 모든 것)를 허용하도록 업데이트되었습니다.

최종 참고:여러 가지 이유로 아직도 이러한 오래된 버전에 남아 있을 수 있는 사람들을 위해 Bash 3.2(또는 3.1)를 사용하여 이러한 별칭을 로드하고 실행하는 테스트를 수행했지만, 이와 같은 오래된 버전은 파서 버그로 악명이 높습니다.이러한 별칭을 설치하는 동안 문제가 발생하면 가장 먼저 셸을 업그레이드해야 합니다(Bash의 경우 Ctrl+X, Ctrl+V로 버전을 확인하십시오).또는 터미널 에뮬레이터에 붙여넣어 설치하려는 경우 파일에 붙여넣고 대신 소스를 제공할 수 있습니다.

. ./git-win-symlinks.sh

다음 모드를 사용하는 파일을 찾아 심볼 링크를 찾을 수 있습니다.120000다음 명령을 사용할 수 있습니다.

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

되지 않은 하는 것이 .git update-index --assume-unchanged그것들을 에 나열하는 것보다..git/info/exclude.

2020년 이상 TL;DR 응답

  1. 10에서 " 모드" - 10/11에 "개발자 모드" - "를 제공합니다.mklink 권한
  2. 다음 중 하나 이상과 함께 심볼 링크가 활성화되었는지 확인합니다.
    • 시스템 설정: msysgit 설치 시 확인란 선택
    • 전역 설정:git config --global core.symlinks true
    • 로컬 설정:git config core.symlinks true

Windows에서 심볼릭 링크를 지원하는 것은 비교적 새로운 일이기 때문에 주의해야 합니다.일부 git 클라이언트에는 여전히 영향을 미치는 버그가 있습니다.특히, 관련 링크는 다음과 같습니다... libgit2 (고정) 회귀로 인해 일부 프로그램에서 경로가 손상됩니다.예를 들어 GitKraken은 업데이트를 기다리고 있기 때문에 이에 영향을 받습니다.v0.x에서 (으)로 ~로v1.x(고정)


누락되거나 끊어진 심볼 링크 재생성

이러한 옵션 중 하나(점점 더 강력해지고 "위험한" 옵션)를 통해 여러 Git 클라이언트에서 다양한 수준의 성공 사례가 보고되었습니다.

  • git checkout -- path/to/symlink
  • 이후 복원(git v2.23.0 이후):git restore -- path/to/symlink
  • 분기 전환(어웨이 및 백)
  • 재설정: 하드재정:git reset --hard
  • 로컬 리포지토리를 삭제하고 다시 복제

문제 해결

git config --show-scope --show-origin core.symlinks설정된 수준(일명 "범위"), 설정을 유지하는 구성 파일(일명 "범위") 및 설정의 현재 값을 표시합니다.대부분 "로컬" 구성이 "글로벌" 또는 "시스템" 설정을 재정의합니다. git config --unset core.symlinks를 선택하면 "로컬" 설정이 지워져 더 높은 수준의 설정이 적용됩니다.

Git SCM의 최신 버전(버전 2.11.1에서 테스트됨)을 사용하면 심볼릭 링크를 사용할 수 있습니다.그러나 심볼릭 링크가 있는 리포지토리를 다시 복제해야 합니다.git clone -c core.symlinks=true <URL>관리자 권한으로 이 명령을 실행해야 합니다.mklink를 사용하여 .

Wiki를 확인하십시오.

여기에 이미지 설명 입력

이러한 답변이 많이 게시된 이후 Git의 상황이 바뀌었기 때문에 Windows에서 심볼릭 링크가 올바르게 작동하도록 하기 위한 올바른 지침은 다음과 같습니다.

2018년 8월


Git가 심볼릭 링크 지원과 함께 설치되었는지 확인합니다.

Git on Windows 설치 중

Bash에게 심볼릭 링크 대신 하드 링크를 생성하라고 말합니다.

(git 폴더)/etc/message.svrc

아래에 - 맨아에추가래▁- -MSYS=winsymlinks:nativestrict

기호 링크를 사용하도록 Git 구성 설정

git config core.symlinks true

또는

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

참고: 글로벌 Git 구성에 추가하려고 시도했지만 현재는 사용할 수 없으므로 각 리포지토리에 추가하는 것이 좋습니다.

저장소를 끌어내다

참고: 최신 버전의 Windows 10에서 개발자 모드를 활성화하지 않은 경우 Bash를 관리자로 실행하여 심볼릭 링크를 생성해야 합니다.

모든 심볼릭 링크 재설정(선택사항)

기존 리포지토리가 있거나 하위 모듈을 사용하는 경우 리포지토리의 모든 심볼 링크를 새로 고치기 위해 심볼 링크가 올바르게 작성되지 않은 것을 발견할 수 있습니다. 이러한 명령을 실행할 수 있습니다.

find -type l -delete
git reset --hard

참고: 마지막 커밋 이후 변경 내용이 재설정되므로 먼저 커밋했는지 확인하십시오.

MSysGit에서 구현해야 하지만 두 가지 단점이 있습니다.

  • 이전 버전에서는 디렉터리 연결만 지원하므로 심볼릭 링크윈도우즈 Vista 이상에서만 사용할 수 있습니다(2011년에는 문제가 되지 않지만...).
  • (큰 문제) Microsoft는 심볼릭 링크를 보안 위험으로 간주하여 관리자만 기본적으로 생성할 수 있습니다.작업하는 모든 컴퓨터에서 이 동작을 변경하려면 Git 프로세스 또는 fstool 사용 권한을 높여야 합니다.

저는 빠른 검색을 했고 이것에 대해 활발하게 작업이 진행되고 있습니다. 224호를 참조하십시오.

단답:개발자 모드를 활성화할 수 있는 경우 이제 이러한 기능이 제대로 지원됩니다.

Windows 10의 Symlinks!:

이제 Windows 10 Creators Update에서는 관리자 권한이 있는 사용자가 먼저 개발자 모드를 활성화한 다음 시스템의 모든 사용자가 명령줄 콘솔을 올리지 않고 mklink 명령을 실행할 수 있습니다.

무엇이 이 변화를 이끌었습니까?심볼릭 링크의 가용성과 사용은 현대 개발자들에게 큰 문제입니다.

git와 같은 많은 인기 있는 개발 도구와 npm과 같은 패키지 관리자는 각각 저장소 또는 패키지를 만들 때 심볼 링크를 인식하고 유지합니다.그런 다음 이러한 리포지토리 패키지가 다른 곳에서 복원되면 심볼릭 링크도 복원되어 디스크 공간(및 사용자 시간)이 낭비되지 않습니다.

다른 모든 "작성자 업데이트" 공지사항에서 간과하기 쉽지만, 개발자 모드를 사용 가능으로 설정하면 상승된 권한 없이 심볼릭 링크를 만들 수 있습니다.기본적으로 Git이 아니기 때문에 Git를 다시 설치하고 심볼릭 링크 지원이 활성화되었는지 확인해야 할 수 있습니다.

심볼릭 링크는 기본적으로 사용할 수 없습니다.

저장소 내에서 심볼릭 링크를 사용하지 않는 것이 좋습니다.실제 내용을 리포지토리 내부에 저장한 다음 내용을 가리키는 리포지토리 외부에 심볼 링크를 배치합니다.

예를 들어 저장소를 사용하여 Unix와 유사한 시스템에서 사이트를 호스팅하는 것과 Windows에서 호스팅하는 것을 비교한다고 가정해 보겠습니다.예를 들어, 콘텐츠를 저장소에 저장합니다./httpRepoContent그리고.c:\httpRepoContentGit, SVN 등을 통해 동기화되는 폴더입니다.

다음 웹서버의 ./var/www그리고.c:\program files\web server\www저장소에 있는 콘텐츠에 대한 심볼릭 링크를 사용하여 {names}은(는) 별로 중요하지 않습니다. edit}.웹 서버는 콘텐츠를 실제로 '올바른' 위치에 있는 것으로 볼 수 있지만, 사용자는 소스 제어를 사용할 수 있습니다.

그러나 저장소 내에서 심볼릭 링크를 사용해야 하는 경우에는 일종의 사전/사후 커밋 스크립트와 같은 것을 조사해야 합니다.예를 들어 포맷터를 통해 코드 파일을 구문 분석하는 등의 작업에 사용할 수 있으므로 플랫폼 간의 심볼 링크를 변환할 수 있어야 합니다.

공통 소스 컨트롤인 SVN, Git 및 MG에 대해 이러한 스크립트를 수행하는 방법을 배울 수 있는 좋은 장소를 알고 있는 사람이 있다면 의견을 추가하십시오.

Josh Lee의 답변에 따라 파일 전용 저장소의 심볼릭 링크를 변환하는 배치 스크립트가 있습니다.관리자 권한에 대한 추가 검사가 포함된 스크립트는 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

Windows Vista, Windows 7 이상에서 Cygwin을 사용하는 사용자의 경우 네이티브git명령은 Android Studio와 같은 Windows 앱에서 인식하는 "적절한" 심볼 링크를 만들 수 있습니다.설정만 하면 됩니다.CYGWIN포함할 함할 변수winsymlinks:native또는winsymlinks:nativestrict이와 같이:

export CYGWIN="$CYGWIN winsymlinks:native"

Cygwin 셸이 이러한 심볼릭 링크를 생성하는 데 필요한 OS 권한을 가지려면 Cygwin 셸이 "관리자 권한으로 실행"되어야 한다는 단점이 있습니다.그러나 일단 생성되면 사용하기 위해 특별한 사용 권한이 필요하지 않습니다.다른 개발자에 의해 저장소에서 변경되지 않는 한,git이후에는 일반 사용자 권한으로 정상적으로 실행됩니다.

개인적으로 Windows 응용 프로그램(즉, Cygwin이 아닌 다른 응용 프로그램)에서 탐색하는 심볼릭 링크에만 사용합니다.

이 옵션에 대한 자세한 내용은 다음 스택 오버플로 질문을 참조하십시오.Windows 7에서 Cygwin과 심볼릭 링크를 만드는 방법

방금 Git 2.30.0(2020-12-28 출시)으로 시도했습니다.

이것은 완전한 답은 아니지만 몇 가지 유용한 정보입니다. (자신의 답을 위해 자유롭게 식인하십시오.)

깃 위키 엔트리

Git for Windows 설치 시 설명서 링크가 있습니다.

여기에 이미지 설명 입력

링크가 여기로 연결됩니다. https://github.com/git-for-windows/git/wiki/Symbolic-Links -- 그리고 이건 꽤 긴 토론입니다.

참고: 적어도 세 가지 "연결 종류"가 있습니다.그리고 이 위키 항목의 중요한 측면을 강조하자면, 저는 이것을 몰랐지만, 표면적으로는 모두 "모종의" 상징적인 링크인 몇 가지 방법이 있지만, 기술적인 수준에서는 매우 다릅니다.

  • gitbash의 "ln-s"그냥 물건을 복사합니다.오, 이런.예상치 못한 일이었습니다. (FYI: Plain Cygwin은 이런 일을 하지 않습니다.)Mobaxterm은 이 작업을 수행하지 않습니다.대신 그들은 둘 다 그들의 무언가를 만듭니다.stat명령어는 실제로 "스캐너 링크"로 인식됩니다.)
  • cmd.exe의 "mklink" 명령어에 "/D" 매개 변수가 포함되어 있습니다. 이 명령어는 디렉토리 심볼릭 링크를 생성합니다.(Microsoft 설명서 참조)
  • cmd.exe는 "/J" 매개 변수가 있는 "mklink" 명령에 내장되어 있습니다.이것은 디렉터리 접합을 만듭니다. 소프트 링크 AKA 재분석 지점.(Microsoft 설명서 참조)

릴리스 정보 항목

또한 릴리스 노트에 기호 링크가 계속 나타납니다.2.30.0 기준으로 이 문제는 여전히 "알려진 문제"로 나열되어 있습니다.

윈도우즈 10에서 1703 이전 버전이거나 개발자 모드를 해제하면 심볼릭 링크가 있는 리포지토리를 복제할 때 특별한 사용 권한이 필요하므로 심볼릭 링크에 대한 지원은 기본적으로 비활성화됩니다.사용하다git clone -c core.symlinks=true <URL>활성화하려면 여기에서 세부 정보를 참조하십시오.

저는 문서 루트와 Git 저장소 디렉토리 사이에 항상 심볼릭 링크를 사용합니다.저는 그것들을 분리하는 것을 좋아합니다.Windows에서는 mklink /j 옵션을 사용합니다.접합부는 Git가 정상적으로 동작하도록 하는 것 같습니다.

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

예:

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

Windows에서 Unix 심볼릭 링크를 쉽게 처리할 수 있는 솔루션을 찾고 있었습니다.이전 답변의 Git 별칭에 대해 감사드립니다.

rm-symbolic 링크에 대해 수행할 수 있는 약간의 최적화가 있으므로 별칭을 두 번째로 실수로 실행할 경우 대상 폴더의 파일이 삭제되지 않습니다.논리를 실행하기 전에 파일이 디렉터리에 대한 링크가 아닌지 확인하려면 루프의 새 if 조건을 확인하십시오.

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

우리가 사용하는 한 가지 간단한 속임수는 그냥 전화하는 것입니다.git add --all연거푸 두 번

예를 들어 Windows 7 커밋 스크립트 호출은 다음과 같습니다.

git add --all
git add --all

번째 추가는 링크를 텍스트로 처리하고 삭제할 폴더를 추가합니다.

번째 추가는 링크를 올바르게 통과하고 파일을 복원하여 삭제를 취소합니다.

제안된 다른 솔루션보다 우아하지는 않지만 심볼릭 링크가 추가된 일부 레거시 환경에 대한 간단한 해결책입니다.

다음은 Unix 심볼 링크를 Windows로 대체하는 PowerShell 스크립트입니다.

# This fixes permission denied errors you might get when
# there are Git symbolic links being used on repositories that
# you share in both POSIX (usually the host) and Windows (VM).
#
# This is not an issue if you are checking out the same
# repository separately in each platform. This is only an issue
# when it's the same working set (AKA make a change without
# committing on OS X, go to Windows VM and Git status would show
# you that change).
#
# Based on this answer on Stack Overflow: http://stackoverflow.com/a/5930443/18475
#
# No warranties. Good luck.
#
# NOTE: It must be run in elevated PowerShell

$ROOT = $PWD

$symlinks = &git ls-files -s | gawk '/120000/{print $4}'
foreach ($symlink in $symlinks) {
  $content = &Get-Content $symlink
  $content = $content.Replace("/", "\")
  $filename = $symlink.Split("/")[-1]
  cd (dirname $symlink)
  rm $filename
  echo Linking $content -> $filename
  New-Item -ItemType SymbolicLink -Path $filename -Target $content
  &git update-index --assume-unchanged $symlink
  cd $ROOT
}

언급URL : https://stackoverflow.com/questions/5917249/git-symbolic-links-in-windows

반응형