Git이 심볼릭 링크를 따르도록하려면 어떻게해야합니까? 아니면 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 관리 디렉토리에서이 명령을 수행하십시오. TARGETDIRECTORYSOURCEDIRECTORY마운트 하기 전에 생성해야합니다 .

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가 이미 설치되어 있으면 hardlink를 설치하십시오 . 하드 링크를 만드는 미세한 도구 입니다.

하드 링크를 만들려면 다음을 수행하십시오.

hln source destination

macOS High Sierra 업데이트

Apple File System은 디렉토리 하드 링크를 지원합니까?

Apple File System은 디렉토리 하드 링크를 지원하지 않습니다. macOS에서 HFS +를 APFS 볼륨 형식으로 변환하면 모든 디렉토리 하드 링크가 기호 링크 또는 별명으로 변환됩니다.

에서 APFS 자주 묻는 질문 developer.apple.com에

따라 https://github.com/selkhateeb/hardlink/issues/31을 미래의 대안을.

Linux 및 기타 Unix 버전에서

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

ln source destination

Windows에서 (Vista, 7, 8,…)

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

mklink /j "source" "destination"

답변

이것은 인덱스의 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 -aPOSIX와 호환되지 않을 수도 있습니다.

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


답변

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>

다른 의견에서 암시되었지만 다른 답변에서는 명확하게 제공되지 않았습니다. 바라건대 이것은 누군가를 시간을 절약 해줍니다.


답변

나는 꽤 오랫동안 심볼릭 링크를 넘어 파일을 추가했었다. 이것은 특별한 조치를 취하지 않고 잘 작동했습니다. Git 1.6.1로 업데이트 한 후에는 더 이상 작동하지 않습니다.

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