Git이 심볼릭 링크를 따르도록 하려면 어떻게 해야 합니까?
문제
최선을 다해 심볼릭 링크를 복사본으로 대체하는 쉘 스크립트를 사용하는 것이 좋을까요, 아니면 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 볼륨 형식으로 변환하면 모든 디렉터리 하드 링크가 기호 링크 또는 별칭으로 변환됩니다.
따르다 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
, 따라서 이 작업을 수행하려면 자신만의 작은 프로그램을 사용해야 합니다.해당 프로그램에 대한 링크는 다음과 같습니다.
즐기다!
~에 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 폴더에 링크 스크립트로.