심볼릭 링크를 복사본으로 대체하는 쉘 스크립트가 최선입니까? 아니면 Git에게 심볼릭 링크를 따르도록 지시하는 다른 방법이 있습니까?
추신 : 나는 그것이 매우 안전하지 않다는 것을 알고 있지만 몇 가지 특별한 경우에만하고 싶습니다.
심볼릭 링크를 복사본으로 대체하는 쉘 스크립트가 최선입니까? 아니면 Git에게 심볼릭 링크를 따르도록 지시하는 다른 방법이 있습니까?
추신 : 나는 그것이 매우 안전하지 않다는 것을 알고 있지만 몇 가지 특별한 경우에만하고 싶습니다.
답변:
참고 : 이 조언은 Git 1.6.1 이후 주석에 따라 오래되었습니다. 힘내는 이런 식으로 행동했지만 더 이상하지 않습니다.
Git은 기본적으로 심볼릭 링크를 따르지 않고 저장하려고합니다 (압축성을 위해 일반적으로 사람들이 원하는 것입니다).
그러나 실수로 symlink가 디렉토리 인 경우 symlink 이외의 파일을 추가하도록했습니다.
즉 :
/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 계정의 파일을 포함하는 데 사용합니다.
umount [mydir]
. (@ user252400의 훌륭한 팁은 +1)
다른 방법으로 심볼릭 링크를 만들지 않겠습니까? Git 리포지토리에서 응용 프로그램 디렉토리로 연결하는 대신 다른 방법으로 연결하면됩니다.
예를 들어, ~/application
구성 파일이 필요한 응용 프로그램을 설치한다고 가정 해 보겠습니다 config.conf
.
config.conf
예를 들어, Git 리포지토리에 추가 합니다 ~/repos/application/config.conf
.~/application
을 실행 하여 심볼릭 링크를 만듭니다 ln -s ~/repos/application/config.conf
.이 방법이 항상 효과가있는 것은 아니지만 지금까지는 효과가있었습니다.
대신 하드 링크를 사용하십시오. 이것은 소프트 (기호) 링크와 다릅니다. 를 포함한 모든 프로그램 git
은 파일을 일반 파일로 취급합니다. 내용이 변경에 의해 변경 될 수 있습니다 하나 의 소스 또는 대상을.
git 및 Xcode가 이미 설치되어 있으면 hardlink를 설치하십시오 . 하드 링크를 만드는 미세한 도구 입니다.
하드 링크를 만들려면 다음을 수행하십시오.
hln source destination
Apple File System은 디렉토리 하드 링크를 지원합니까?
Apple File System은 디렉토리 하드 링크를 지원하지 않습니다. macOS에서 HFS +를 APFS 볼륨 형식으로 변환하면 모든 디렉토리 하드 링크가 기호 링크 또는 별명으로 변환됩니다.
따라 https://github.com/selkhateeb/hardlink/issues/31을 미래의 대안을.
이 ln
명령은 하드 링크를 만들 수 있습니다.
ln source destination
누군가 mklink 를 사용 하여 Windows에서 접합을 만들 것을 제안 했지만 시도하지 않았습니다.
mklink /j "source" "destination"
ln source destination
OS X에서도 작동합니다. 엘 캐피 탄에서 테스트되었습니다.
cp -al source destination
. `-l '은 복사하는 대신 하드 링크 파일을 의미합니다.
이것은 인덱스의 symlink blob을 해당 symlink의 내용으로 대체 하는 사전 커미트 후크 입니다.
이에 넣어 .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와 호환되지 않을 수도 있습니다.
이 코드는 다소 테스트되었지만 오류 / 오류가있을 수 있습니다.
typechange
에 git status
대해서는 여전히 표시 되지만 지금은 그렇지 않습니다.
process_links_to_nondir
입니까?
argv[0]
의 명령 이름으로 사용되는 이름 / 입니다 sh
. (내가 ☺😃 무엇인지 기억하지 못했기 때문에 알아낼 약간의 정보를 얻었습니다)
find: missing argument to -exec'
있습니다. 모든 것을 단일 라인으로 파이핑 및 결합하는 대신 단계별 명령 실행이 필요할 수 있습니다.
typechange
@DavidFraser와 비슷하지만 링크 된 파일이 더 이상 준비되지 않는 것 같습니다)
에 MacOS
(내가 모하비 / 10.14,가 git
, 사용 버전 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>
다른 의견에서 암시되었지만 다른 답변에서는 명확하게 제공되지 않았습니다. 바라건대 이것은 누군가를 시간을 절약 해줍니다.
Failed to resolve
... No such file or directory
오류가 발생 합니다 . bindfs
구식이거나 루트가 필요한 모든 솔루션에 질려서 LD_PRELOAD 기반 솔루션을 만들었습니다 (Linux 만 해당).
그것은 Git의 내부에 연결되어 '이것이 심볼릭 링크입니까?'를 재정의합니다. 심볼릭 링크를 내용으로 취급 할 수 있습니다. 기본적으로 리포지토리 외부에 대한 모든 링크는 인라인됩니다. 자세한 내용은 링크를 참조하십시오.
LD_PRELOAD
라이브러리 기능을 재정의 하는 데 사용 하는 매우 창의적인 솔루션 !
힘내 함께 2.3.2+ (Q1 2015) 힘내 것 이상의 다른 경우가 없는 이상 심볼릭 링크를 따라가 : 참조 e0d201b 투입 하여 Junio C 하마노 ( gitster
) (주 힘내 테이너)
apply
: 심볼릭 링크를 넘어 파일을 만지지 마십시오망할 놈의 심볼릭 링크로 심볼릭 링크, 자사의 주요 부분에 대한 기호 링크가있는 경로를 추적하기 때문에 (예를 들어
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
이를 위해 작은 프로그램을 사용해야합니다. 해당 프로그램에 대한 링크는 다음과 같습니다.
즐겨!
Git 1.5.4.3을 사용하고 있으며 슬래시가 있으면 전달 된 symlink를 따릅니다. 예 :
# Adds the symlink itself
$ git add symlink
# Follows symlink and adds the denoted directory's contents
$ git add symlink/
fatal: 'src/' is beyond a symbolic link
심볼릭 링크에서의 변환이 유용 할 수 있습니다. 스크립트 로 심볼릭 링크 대신 Git 폴더에 링크하십시오 .