programing

어떻게 하면 Git가 심볼 링크를 따르도록 할 수 있습니까?

linuxpc 2023. 5. 11. 21:11
반응형

어떻게 하면 Git가 심볼 링크를 따르도록 할 수 있습니까?

제 최선은 심볼릭 링크를 복사본으로 대체하는 셸 스크립트가 되는 것입니까, 아니면 Git에게 심볼릭 링크를 따르라고 말하는 다른 방법이 있습니까?

PS: 그다지 안전하지 않다는 것은 알지만, 몇 가지 구체적인 경우에만 그렇게 하고 싶습니다.

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

sudo mount --bind SOURCEDIRECTORY TARGETDIRECTORY

Git 관리 디렉토리에서 이 명령을 수행합니다. TARGETDIRECTORY는 전에생야합다니해 .SOURCEDIRECTORY그 안에 장착되어 있습니다.

Linux에서는 잘 작동하지만 OS X에서는 작동하지 않습니다!그 속임수는 서브버전에도 도움이 되었습니다.웹 디자이너가 자신의 일을 하는 드롭박스 계정의 파일을 포함하는 데 사용합니다.

으로 하려면 을 이바딩을영설다면추행다가니합을음에 합니다./etc/fstab:

/sourcedir /targetdir none bind

반대로 심볼릭 링크를 생성하면 어떨까요?Git 저장소에서 응용 프로그램 디렉터리로 링크하는 대신 다른 방법으로 링크하는 것을 의미합니다.

예를 들어, 다음에 설치된 응용 프로그램을 설정한다고 가정합니다.~/application 파일이 한 경우config.conf:

  • 추가합니다config.conf를 들어,, 내를소에에 ▁gitory 저장소로~/repos/application/config.conf.
  • 그런 다음 심볼 링크를 만듭니다.~/application을 으로써.ln -s ~/repos/application/config.conf.

이 방법이 항상 효과가 있는 것은 아닐 수도 있지만, 지금까지는 저에게 효과가 있었습니다.

대신 하드 링크를 사용합니다.소프트(동형) 링크와는 다릅니다.다을포함모프램로를 한 모든git파일을 일반 파일로 처리합니다.원본 또는 대상을 변경하여 내용을 수정할 수 있습니다.

macOS(10.13 High Sierra 이전 버전)

Git 및 Xcode가 이미 설치되어 있으면 hardlink를 설치합니다.그것은 하드 링크를 만드는 미시적인 도구입니다.

하드 링크를 만들려면 다음과 같이 하십시오.

hln source destination

macOS High Sierra 업데이트

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

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

developer.apple.com 의 APFS FAQ에서 확인할 수 있습니다.

미래의 대안은 https://github.com/selkhateeb/hardlink/issues/31 을 참조하십시오.

리눅스 및 기타 유닉스 버전의 경우

ln명령은 하드 링크를 만들 수 있습니다.

ln source destination

Windows(Vista, 7, 8, …)의 경우

mklink를 사용하여 Windows에서 연결을 만듭니다.

mklink /j "source" "destination"

참고: 이 조언은 Git 1.6.1 이후로 의견에 따라 구식이 되었습니다.Git는 예전에는 이런 식으로 행동했지만, 더 이상 그렇지 않습니다.


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

하지만 심볼릭 링크가 디렉토리일 때 실수로 심볼릭 링크를 넘어 파일을 추가할 수 있게 되었습니다.

예:

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

함으로써

 git add /bar/foo/baz

제가 해보니 효과가 있는 것 같았습니다.하지만 그 행동은 당시 제가 원치 않았던 행동이었기 때문에 그 이상의 정보는 드릴 수 없습니다.

인덱스의 심볼릭 블롭을 심볼릭 링크의 내용으로 대체하는 사전 커밋 후크입니다.

이거 넣어주세요.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 POSIX 호환 기능을 사용합니다.diff -aPOSIX를 준수하지 않을 수 있습니다.

이 코드는 다소 테스트되었지만 일부 오류/오류가 있을 수 있습니다.

14, macOS를 가지고 git 2 § 2.7.1), » 사용bindfs.

brew install bindfs

cd /path/to/git_controlled_dir

mkdir local_copy_dir

bindfs </full/path/to/source_dir> </full/path/to/local_copy_dir>

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

여기 있는 모든 솔루션이 구식이거나 루트가 필요한 것에 싫증이 나서 LD_PRELOAD 기반 솔루션(Linux 전용)을 만들었습니다.

Git의 내부에 연결하여 '이것이 심볼릭 링크입니까?' 기능을 재정의하여 심볼릭 링크를 콘텐츠로 처리할 수 있습니다.기본적으로 레포 외부에 대한 모든 링크는 인라인으로 표시됩니다. 자세한 내용은 링크를 참조하십시오.

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

Git 1.6.0으로 전환하여 이 작업을 수행할 수 있습니다.나는 미래의 Git 버전이 다음과 같은 깃발을 가지고 있기를 바랍니다.git-add심볼릭 링크를 다시 따르도록 허용합니다.

Git 2.3.2+ (2015년 1분기)와 함께 Git이 더 이상 심볼릭 링크를 따르지 않을 다른 사례가 있습니다: 주니오 C 하마노()gitstercommit0d201b 참조(주 Git 유지 관리자)

apply를 .

링크로 하기 때문에 부분에 Git는심볼릭링심링추예볼크때릭적있링는심경크가볼로릭선부에분두문에하크로기를예▁that▁because▁path있경는:로(▁in링▁hase크가: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다윈에게는 효과가 없는 것 같습니다.

누가 그럴 수 있는 속임수를 가지고 있나요?

[계속]

네, 맥 OS X에서 정답은 하드 링크를 만드는 것입니다.API가 다음을 통해 노출되지 않는다는 점을 제외하고는ln그래서 당신은 이것을 하기 위해 당신만의 작은 프로그램을 사용해야 합니다.다음은 해당 프로그램에 대한 링크입니다.

Mac OS X에서 디렉터리 하드 링크 만들기

맛있게 드세요!

@user252400이 제안하는 것의 대안적인 구현은 다음과 같습니다.bwrap모든 주요 배포에서 찾을 수 있는 작은 setuid 샌드박스(대부분 기본적으로 설치됨). bwrap를 사용하지 않고 마운트 디렉토리를 바인딩할 수 있습니다. sudo그리고 git 또는 당신의 쉘이 나갈 때 자동으로 그것들을 풀어줍니다.

개발 프로세스가 너무 비정상적이지 않다고 가정하면(아래 참조) 개인 네임스페이스에서 bash를 시작하고 git 디렉토리 아래에 외부 디렉토리를 바인딩합니다.

bwrap --ro-bind / / \
      --bind {EXTERNAL-DIR} {MOUNTPOINT-IN-GIT-DIR} \
      --dev /dev \
      bash

그럼 당신이 평소에 하고 싶은 모든 것을 하세요.git add,git commitbash를 끝나면, 그냥 bash를 종료하세요.깔끔하고 단순합니다.

파일: 탈출을 하기 위해,bwrap다른 setuid 바이너리는 실행할 수 없습니다.» man bwrap자세한 내용은

하드 링크에서 변경한 내용이 깃별로 준비되므로 하드 링크를 사용해야 합니다.

하드 링크를 만드는 구문은 입니다.

여기서 file1은 하드 링크를 만들 파일의 위치이고 file2는 하드 링크의 위치입니다.

그게 도움이 되길 바랍니다.

나는 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 폴더에 링크합니다.

언급URL : https://stackoverflow.com/questions/86402/how-can-i-get-git-to-follow-symlinks

반응형