etc./StackOverFlow

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

청렴결백한 만능 재주꾼 2021. 12. 31. 03:33
반응형

질문자 :Alex


심볼릭 링크인 파일이나 디렉토리가 있고 Git 리포지토리에 커밋하면 어떻게 됩니까?

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

참조하는 파일을 삭제하면 어떻게 됩니까? 댕글링 링크만 커밋합니까?



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

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

심볼릭 링크가 참조하는 파일을 삭제하면 Git 제어 심볼릭 링크에 어떤 식으로든 영향을 주지 않습니다. 댕글링 참조를 갖게 됩니다. 필요한 경우 유효한 것을 가리키도록 링크를 제거하거나 변경하는 것은 사용자의 몫입니다.


CB Bailey

심볼릭 링크를 인덱스에 추가하여 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 add ./symlink

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

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

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

 $ git cat-file -p 1596f9db1b9610f238b78dd168ae33faa2dec15c /path/referenced/by/symlink

(참고 120000 ls-files 출력에 나열된 모드입니다. 일반 파일의 경우 100644

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

core.symlinks

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

따라서 저장소의 심볼릭 링크를 사용하면 체크아웃 시 core.symlinks 구성 값에 따라 전체 파일 시스템 경로에 대한 참조가 포함된 텍스트 파일이나 적절한 심볼릭 링크를 core.symlinks 있습니다.

어느 쪽이든, 심볼릭 링크가 참조하는 경로의 내용은 저장소에 저장되지 않습니다(참조된 경로가 저장소에도 있는 경우 제외).


Dmitry Minkovsky

"편집자" 주: 이 게시물은 오래된 정보를 포함할 수 있습니다. 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 pull 및 일부 업데이트 발견 후

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

Shekhar

특별한 경우: " git checkout " ( man ) 이 체크아웃 중인 커밋에 존재하지 않는 경로를 제거할 때 Git 2.32(Q2 2021)에서 수정된 기호 링크를 따르지 않도록 주의하지 않았습니다.

Matheus Tavares( matheustavares )의 commit fab78a0 , commit 462b4e8 (2021년 3월 18일)을 참조하십시오.
(2021년 3월 30일 커밋 9210c68 에서 Junio C gitster -- gitster -- 병합)

checkout : 항목을 제거할 때 심볼릭 링크를 따르지 마십시오.

사인오프: Matheus Tavares

1d718a5 ("추적되지 않은 심볼릭 링크를 덮어쓰지 않음", 2011-02-20, Git v1.7.5-rc0 -- merge )에서 symlink.c FL_ENOENTFL_SYMLINK 대해 다른 코드를 반환하기 시작했습니다.
그러나 호출자 중 하나인 unlink_entry() 는 이 변경 사항에 대해 조정되지 않았으므로 제거할 항목의 선행 경로에서 심볼릭 링크를 따르기 시작했습니다.
그것을 수정하고 회귀 테스트를 추가하십시오.

그리고 더 이상 이러한 경로를 연결 해제하려고 하지 않기 때문에 remove_or_warn() 에서 경고도 받지 않습니다.

일반 파일 및 심볼릭 링크의 경우 처음부터 경고가 유용했는지 여부는 의문입니다. unlink_entry() 는 우리가 체크아웃하는 상태에서 더 이상 존재하지 않아야 하는 추적된 경로를 제거합니다.
경로의 선행 디렉토리가 다른 파일로 대체된 경우 기본 이름이 이미 존재하지 않으므로 경고가 필요하지 않음을 의미합니다.
물론, 경로의 dirname에 일반 파일이나 심볼릭 링크를 남겨두고 있지만 이 파일은 지금 추적되지 않거나(다시 경고할 필요가 없음) 이 체크아웃의 다음 단계에서 추적된 파일로 대체됩니다.


VonC

출처 : http:www.stackoverflow.com/questions/954560/how-does-git-handle-symbolic-links

반응형