어떻게 하면 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 볼륨 형식으로 변환하면 모든 디렉터리 하드 링크가 심볼릭 링크 또는 별칭으로 변환됩니다.
미래의 대안은 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 -a
POSIX를 준수하지 않을 수 있습니다.
이 코드는 다소 테스트되었지만 일부 오류/오류가 있을 수 있습니다.
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 하마노()gitster
의 commit0d201b 참조(주 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
그래서 당신은 이것을 하기 위해 당신만의 작은 프로그램을 사용해야 합니다.다음은 해당 프로그램에 대한 링크입니다.
맛있게 드세요!
@user252400이 제안하는 것의 대안적인 구현은 다음과 같습니다.bwrap
모든 주요 배포에서 찾을 수 있는 작은 setuid 샌드박스(대부분 기본적으로 설치됨). bwrap
를 사용하지 않고 마운트 디렉토리를 바인딩할 수 있습니다. sudo
그리고 git 또는 당신의 쉘이 나갈 때 자동으로 그것들을 풀어줍니다.
개발 프로세스가 너무 비정상적이지 않다고 가정하면(아래 참조) 개인 네임스페이스에서 bash를 시작하고 git 디렉토리 아래에 외부 디렉토리를 바인딩합니다.
bwrap --ro-bind / / \
--bind {EXTERNAL-DIR} {MOUNTPOINT-IN-GIT-DIR} \
--dev /dev \
bash
그럼 당신이 평소에 하고 싶은 모든 것을 하세요.git add
,git commit
bash를 끝나면, 그냥 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
'programing' 카테고리의 다른 글
mongoose에서 가중치를 사용한 전체 텍스트 검색 (0) | 2023.05.16 |
---|---|
장고에서 추상 사용자와 추상 기본 사용자의 차이점은 무엇입니까? (0) | 2023.05.16 |
커밋 해시가 지정된 GitHub에서 커밋 찾기 (0) | 2023.05.11 |
HTML은 왜 "척노리스"가 색이라고 생각합니까? (0) | 2023.05.11 |
UPSERT *삽입 또는 교체하지 않음* (0) | 2023.05.11 |