Git이 심볼릭 링크를 따르도록 하려면 어떻게 해야 합니까?

StackOverflow https://stackoverflow.com/questions/86402

  •  01-07-2019
  •  | 
  •  

문제

최선을 다해 심볼릭 링크를 복사본으로 대체하는 쉘 스크립트를 사용하는 것이 좋을까요, 아니면 Git에게 심볼릭 링크를 따르도록 지시하는 또 다른 방법이 있습니까?

추신:그다지 안전하지 않다는 것을 알고 있지만 몇 가지 특정한 경우에만 그렇게 하고 싶습니다.

도움이 되었습니까?

해결책

메모: 이 조언은 Git 1.6.1 이후로 주석에 따라 오래되었습니다.Git은 이런 식으로 행동했지만 더 이상 그렇지 않습니다.


Git은 기본적으로 심볼릭 링크를 따르는 대신 심볼릭 링크를 저장하려고 시도합니다(간결함을 위해 일반적으로 사람들이 원하는 것입니다).

그러나 나는 실수로 심볼릭 링크가 디렉터리일 때 심볼릭 링크 너머에 파일을 추가하도록 했습니다.

즉.:

  /foo/
  /foo/baz
  /bar/foo --> /foo
  /bar/foo/baz

함으로써

 git add /bar/foo/baz

내가 시도했을 때 작동하는 것 같았습니다.그러나 그 행동은 당시 제가 원치 않았던 행동이었기 때문에 그 이상의 정보는 드릴 수 없습니다.

다른 팁

Git에 심볼릭 링크 내의 파일을 가져오기 위해 추가한 작업(심볼릭 링크를 사용하지는 않았지만):

sudo mount --bind SOURCEDIRECTORY TARGETDIRECTORY

Git 관리 디렉터리에서 이 명령을 수행하세요. TARGETDIRECTORY 생성되기 전에 생성되어야 합니다. SOURCEDIRECTORY 그 안에 장착되어 있습니다.

Linux에서는 제대로 작동하지만 OS X에서는 작동하지 않습니다.그 트릭은 Subversion에도 도움이 되었습니다.나는 웹 디자이너가 자신의 작업을 수행하는 Dropbox 계정의 파일을 포함하는 데 이를 사용합니다.

반대 방향으로 심볼릭 링크를 만드는 것은 어떨까요?즉, Git 저장소에서 애플리케이션 디렉터리로 연결하는 대신 반대 방향으로 연결하면 됩니다.

예를 들어, 내가 설치된 애플리케이션을 설정한다고 가정해 보겠습니다. ~/application 구성 파일이 필요한 경우 config.conf:

  • 나는 추가한다 config.conf 예를 들어 내 Git 저장소에 ~/repos/application/config.conf.
  • 그런 다음 다음에서 심볼릭 링크를 만듭니다. ~/application 실행하여 ln -s ~/repos/application/config.conf.

이 접근 방식이 항상 효과가 있는 것은 아니지만 지금까지는 나에게 효과적이었습니다.

대신 하드 링크를 사용하세요.이는 소프트(기호) 링크와 다릅니다.포함한 모든 프로그램 git 파일을 일반 파일로 처리합니다.변경에 따라 내용이 수정될 수 있음을 참고하세요. 어느 하나 소스 또는 대상.

macOS(10.13 High Sierra 이전)

이미 git과 Xcode가 설치되어 있다면, 하드링크 설치.현미경이군요 하드 링크를 생성하는 도구.

하드 링크를 만들려면 다음을 수행하세요.

hln source destination

macOS High Sierra 업데이트

Apple 파일 시스템은 디렉토리 하드 링크를 지원합니까?

Apple 파일 시스템에서는 디렉토리 하드 링크를 지원하지 않습니다.macOS에서 HFS+에서 APFS 볼륨 형식으로 변환하면 모든 디렉터리 하드 링크가 기호 링크 또는 별칭으로 변환됩니다.

에서 개발자.apple.com의 APFS FAQ

따르다 https://github.com/selkhateeb/hardlink/issues/31 미래의 대안을 위해.

Linux 및 기타 Unix 버전

그만큼 ln 명령으로 하드 링크를 만들 수 있습니다.

ln source destination

Windows(Vista, 7, 8, …)

누군가가 사용을 제안했습니다. mklink Windows에서 접합을 생성했지만 시도하지 않았습니다.

mklink /j "source" "destination"

이것은 사전 커밋 후크 이는 인덱스의 심볼릭 링크 blob을 해당 심볼릭 링크의 콘텐츠로 대체합니다.

이것을 넣어 .git/hooks/pre-commit, 실행 가능하게 만듭니다.

#!/bin/sh
# (replace "find ." with "find ./<path>" below, to work with only specific paths)

# (these lines are really all one line, on multiple lines for clarity)
# ...find symlinks which do not dereference to directories...
find . -type l -exec test '!' -d {} ';' -print -exec sh -c \
# ...remove the symlink blob, and add the content diff, to the index/cache
    'git rm --cached "$1"; diff -au /dev/null "$1" | git apply --cached -p1 -' \
# ...and call out to "sh".
    "process_links_to_nondir" {} ';'

# the end

노트

우리는 가능한 한 POSIX 호환 기능을 사용합니다.하지만, diff -a 무엇보다도 POSIX와 호환되지 않습니다.

이 코드는 어느 정도 테스트되었음에도 불구하고 일부 실수/오류가 있을 수 있습니다.

나는 꽤 오랫동안 심볼릭 링크를 넘어서 파일을 추가하곤 했습니다.특별한 준비 없이도 잘 작동했습니다.Git 1.6.1로 업데이트한 이후로 더 이상 작동하지 않습니다.

이 작업을 수행하려면 Git 1.6.0으로 전환할 수 있습니다.Git의 향후 버전에는 다음을 위한 플래그가 있기를 바랍니다. git-add 다시 심볼릭 링크를 따라갈 수 있도록 허용합니다.

나는 여기에 있는 모든 솔루션이 오래되었거나 루트가 필요한 것에 지쳤습니다. LD_PRELOAD 기반 솔루션을 만들었습니다. (리눅스에만 해당).

그것은 Git의 내부에 연결되어 '이것은 Symlink입니까?' Symlinks를 내용으로 처리 할 수 ​​있습니다.기본적으로 저장소 외부에 대한 모든 링크는 인라인됩니다.자세한 내용은 링크를 참조하세요.

Git 2.3.2+(2015년 1분기)에는 Git이 ~ 아니다 더 이상 심볼릭 링크를 따르십시오.보다 e0d201b 커밋 ~에 의해 주니오 C 하마노(gitster) (주 Git 관리자)

apply:심볼릭 링크 너머의 파일을 건드리지 마십시오

Git은 심볼릭 링크를 심볼릭 링크로 추적하기 때문에 선행 부분에 심볼릭 링크가 있는 경로(예: path/to/dir/file, 어디 path/to/dir 작업 트리 내부 또는 외부의 다른 위치에 대한 기호 링크)는 동일한 패치가 먼저 기호 링크를 제거하여 거기에 디렉토리를 생성할 수 있도록 허용하지 않는 한 유효하게 적용되는 패치에 절대 나타날 수 없습니다.

이러한 패치를 감지하고 거부합니다.

마찬가지로, 입력이 심볼릭 링크를 생성할 때 path/to/dir 그런 다음 파일을 만듭니다. path/to/dir/file, 실제로 생성하지 않고 오류로 플래그를 지정해야 합니다. path/to/dir 파일 시스템의 심볼릭 링크.

대신, 경로를 떠나는 입력의 모든 패치(예:비삭제) 결과적으로 입력의 모든 패치를 검사한 다음 패치 적용 대상(인덱스 또는 작업 트리)을 검사하여 패치가 생성할 결과 트리에 대해 모든 선행 경로를 검사합니다.

이를 통해 우리는:

  • 장난이나 실수를 잡아서 심볼릭 링크를 추가하세요 path/to/dir 그리고 파일 path/to/dir/file 동시에,
  • 기호를 제거하는 유효한 패치를 허용하는 동안 link path/to/dir 그런 다음 파일을 추가합니다. path/to/dir/file.

즉, 이 경우 오류 메시지는 다음과 같은 일반적인 메시지가 아닙니다. "%s: patch does not apply", 이지만 좀 더 구체적인 내용은 다음과 같습니다.

affected file '%s' is beyond a symbolic link

흠, mount --bind 다윈에서는 작동하지 않는 것 같습니다.

누구든지 그런 트릭을 가지고 있습니까?

[편집됨]

좋습니다. Mac OS X에서는 하드링크를 만드는 것이 답이라는 것을 알았습니다.해당 API가 다음을 통해 노출되지 않는다는 점을 제외하면 ln, 따라서 이 작업을 수행하려면 자신만의 작은 프로그램을 사용해야 합니다.해당 프로그램에 대한 링크는 다음과 같습니다.

Mac OS X에서 디렉토리 하드 링크 생성

즐기다!

~에 MacOS (저는 Mojave/10.14를 가지고 있습니다. git 버전 2.7.1), 사용 bindfs.

brew install bindfs

cd /path/to/git_controlled_dir

mkdir local_copy_dir

bindfs <source_dir> local_copy_dir

다른 의견에서는 암시되었지만 다른 답변에서는 명확하게 제공되지 않았습니다.이를 통해 누군가의 시간이 절약되기를 바랍니다.

저는 Git 1.5.4.3을 사용하고 있으며 끝에 슬래시가 있으면 전달된 심볼릭 링크를 따릅니다.예:

# Adds the symlink itself
$ git add symlink

# Follows symlink and adds the denoted directory's contents
$ git add symlink/

심볼릭 링크로부터의 변환이 유용할 수 있습니다.심볼릭 링크 대신 Git 폴더에 링크 스크립트로.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top