Git은 심볼릭 링크를 어떻게 처리합니까?


1607

기호 링크 인 파일 또는 디렉토리가 있고 Git 저장소에 커밋하면 어떻게됩니까?

파일이 삭제 될 때까지 파일을 심볼릭 링크로 남겨두고 이전 버전에서 파일을 다시 가져 오면 일반 파일 만 생성한다고 가정합니다.

참조하는 파일을 삭제하면 어떻게됩니까? 매달려있는 링크를 커밋합니까?


19
.gitignore심볼릭 링크를 폴더가 아닌 파일로 봅니다.
0xcaff

6
글쎄, 그 대답이 암시하는 것보다 더 많은 질문이 있습니다. 예를 들어, 다음 사항이 궁금합니다. 저장소에서 해당 저장소의 일부 큰 파일에 대한 sym 링크를 작성하고 변경 사항을 푸시 한 다음 해당 변경 사항을 다른 시스템으로 가져 오면 어떻게됩니까? 큰 파일이 두 위치 모두에 큰 파일로 저장됩니까, 아니면 새 컴퓨터에서 링크 파일이 원본 큰 파일을 가리 키도록 sym 링크가 유지됩니까?
jvriesem 2016 년

7
이것은 오래된 스레드이지만이 주석은 여전히 ​​유용 할 수 있습니다. jviesem에 대한 응답으로, 소프트 링크는 기본적으로 다른 파일 이름을 가진 파일입니다. 따라서 다른 컴퓨터로 가져 오면 링크가 다운로드되고 원래 파일 시스템에 큰 파일 이름이 표시됩니다. 새 컴퓨터에서 이름이 유효하지 않으면 링크 이름이 유효하지 않습니다. 큰 파일은 새 컴퓨터로 다운로드되지 않습니다.
lasaro

6
@lasaro, git repo에서 끊어진 링크를 피하는 방법 ../..은 필요에 따라 심볼릭 링크를 만들 때 항상 상대 경로를 사용 하는 것입니다.
와일드 카드

8
대부분의 Windows 버전에서 심볼릭 링크를 만들려면 높은 권한이 필요합니다. Windows를 git pull사용 중이고 symlink 대신 파일을 작성하는 경우 관리자 권한으로 Git 클라이언트를 실행하십시오.
axmrnv

답변:


1348

Git은 링크의 내용 (즉, 링크되는 파일 시스템 객체의 경로)을 일반 파일과 마찬가지로 'blob'에 저장합니다. 그런 다음 포함 디렉토리를 나타내는 트리 객체에 이름, 모드 및 유형 (심볼릭 링크 포함)을 저장합니다.

링크가 포함 된 트리를 체크 아웃하면 대상 파일 시스템 오브젝트의 존재 여부에 관계없이 오브젝트가 심볼릭 링크로 복원됩니다.

심볼릭 링크가 참조하는 파일을 삭제해도 Git 제어 심볼릭 링크에는 영향을 미치지 않습니다. 매달린 참조가 있습니다. 필요한 경우 유효한 것을 가리 키도록 링크를 제거하거나 변경하는 것은 사용자의 책임입니다.


328
BTW. 심볼릭 링크를 지원하지 않는 FAT와 같은 파일 시스템에 있고 리포지토리에서이를 사용하는 경우 core.symlinks구성 변수를 false로 설정할 수 있으며 심볼릭 링크는 링크 텍스트를 포함하는 작은 일반 텍스트 파일로 체크 아웃됩니다.
Jakub Narębski

14
@ JakubNarębski 나는 이것을 전에 보았다. 리포지토리에는 한 줄의 텍스트 파일이 있는데, 우리가 사용하는 라이브러리의 경로입니다. 그 목적이 무엇인지 알 수 없습니다. 나는 지금 무슨 일이 있었는지 압니다.
Matt K

25
나는 고도로 공감 된 답변에 대해 주저하지만 "일반 파일과 마찬가지로"라는 문구가 새로운 사람들에게 오해의 소지가 있다고 생각합니다.
Matthew Hannigan

10
(편집 시간이 지난 경우) 내용이 얼룩에 있다는 점만 일반 파일과 같습니다. 중요한 차이점은 일반 파일의 경우 blob이 파일 내용이지만 symlink의 경우 blob에 연결된 파일의 경로 이름이 있다는 것입니다. @ JakubNarębski "작은 평범한 텍스트 파일"에 관해서는 .. 당신은 그것들이 작고 텍스트이지만 희망은 물론 블롭이 블랍이고 잠재적으로 거대하고 이진적일 수 있음을 희망 할 것입니다. 파일이 심볼릭 링크로 잘못 입력 된 경우 stackoverflow.com/questions/18411200/… 을 참조하십시오 .
Matthew Hannigan

2
심볼릭 링크에 대한 전역 설정과 심볼릭 링크에 대한 로컬 설정을 확인하십시오. TortiseGit 또는 창에서 설정을 복사 한 경우 설정이 지저분해질 수 symlinks = false있습니다.
phyatt

250

인덱스에 파일을 추가 할 때 수행하는 작업을 확인하여 파일에서 Git이 수행하는 작업을 확인할 수 있습니다. 색인은 사전 커밋과 같습니다. 인덱스가 커밋되면 인덱스에 git checkout있던 모든 것을 작업 디렉터리로 다시 가져올 수 있습니다 . 인덱스에 심볼릭 링크를 추가 할 때 Git은 무엇을 하는가?

먼저, 심볼릭 링크를 만드십시오.

$ ln -s /path/referenced/by/symlink symlink

Git은이 파일에 대해 아직 모른다. git ls-files색인을 검사 할 수 있습니다 ( -s인쇄 stat출력).

$ git ls-files -s ./symlink
[nothing]

이제 심볼릭 링크의 내용을 인덱스에 추가하여 Git 객체 저장소에 추가하십시오. 인덱스에 파일을 추가하면 Git은 그 내용을 Git 객체 저장소에 저장합니다.

$ git add ./symlink

그래서 무엇이 추가 되었습니까?

$ git ls-files -s ./symlink
120000 1596f9db1b9610f238b78dd168ae33faa2dec15c 0       symlink

해시는 Git 객체 저장소에서 생성 된 압축 된 객체에 대한 참조입니다. .git/objects/15/96f9db1b9610f238b78dd168ae33faa2dec15c리포지토리의 루트를 살펴보면이 개체를 검사 할 수 있습니다 . 이것은 Git이 저장소에 저장 한 파일로 나중에 체크 아웃 할 수 있습니다. 이 파일을 살펴보면 파일이 매우 작다는 것을 알 수 있습니다. 링크 된 파일의 내용을 저장하지 않습니다.

(참고 120000ls-files출력에 나열된 모드 입니다. 100644일반 파일 과 유사 합니다.)

그러나 저장소에서 파일 시스템으로 체크 아웃 할 때 Git 은이 객체로 무엇을합니까? core.symlinks구성 에 따라 다릅니다 . 보낸 사람 man git-config:

core.symlinks

False 인 경우 심볼릭 링크는 링크 텍스트가 포함 된 작은 일반 파일로 체크 아웃됩니다.

따라서 저장소에 기호 링크가 있으면, 체크 아웃 할 때 전체 파일 시스템 경로를 참조하는 텍스트 파일 또는 core.symlinks구성 값에 따라 적절한 기호 링크를 얻습니다 .

어느 쪽이든, 심볼릭 링크가 참조하는 데이터는 저장소에 저장되지 않습니다.


1
대단한 답변
CervEd

147

"편집자"참고 :이 게시물에는 오래된 정보가 포함되어있을 수 있습니다. 1.6.1 이후 Git의 변경 사항에 대한 의견 과이 질문을 참조하십시오 .

심볼릭 링크 된 디렉토리 :

소프트 링크 인 디렉토리가있을 때 발생하는 사항에 유의해야합니다. 업데이트가있는 Git 풀은 링크를 제거하고 일반 디렉토리로 만듭니다. 이것이 내가 열심히 배운 것입니다. 여기여기에 약간의 통찰력이 있습니다 .

전에

 ls -l
 lrwxrwxrwx 1 admin adm   29 Sep 30 15:28 src/somedir -> /mnt/somedir

git add/commit/push

It remains the same

git pullAND 업데이트가 발견 된 후

 drwxrwsr-x 2 admin adm 4096 Oct  2 05:54 src/somedir

4
심볼릭 링크 된 디렉토리에 대한 이러한 경고는 버전이 지정된 심볼릭 링크 에는 적용 되지 않습니다 . 문제의 주된 경우는 작업 트리의 일부 또는 전부를 다른 경로 (예 : 더 많은 디스크 공간을 가진 다른 파티션에)로 심볼릭 링크하고 git이 기존 심볼릭 링크를 통해 코드를 체크 아웃하는 것을 기대하는 사람들이었습니다. 즉, 파일이나 디렉토리에 대한 버전이 지정된 심볼릭 링크가 포함 된 프로젝트가있는 경우 일반적인 심볼릭 링크로서의 동작은 심볼릭 링크를 유지하고 해당 심볼릭 링크의 버전 변경을 올바르게 수행하며 그렇지 않으면 예상대로 작동합니다.
John Whitley

위의 동작은 git 1.6.5.6으로 테스트되었습니다. 그러나 나는 버전이 지정된 행동이 꽤 오랫동안 git에서 정확하다고 의심한다.
존 휘 틀리

22
이 동작이 모든 버전의 git에 존재합니까, 아니면 수정 되었습니까?
jbotnik 2016 년

24
이 문제는 현재 해결 된 것 같습니다. stackoverflow.com/a/1943656/1334781
Ron Wertlen

2
Shekar : 최근 몇 년 동안 git의 변경 사항을 반영하도록 답변을 편집 하시겠습니까?
einpoklum
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.