힘내 및 하드 링크


97

Git이 저장소 외부를 가리키는 심볼릭 링크를 인식하지 못한다는 점을 고려할 때 하드 링크를 사용하는 데 문제가 있습니까?

힘내가 그들을 깰 수 있습니까? 자세한 정보를 알려 주시겠습니까?


2
무엇을하려고하고 그 이유는 무엇입니까? 하드 링크는 일반 파일과 다르지 않습니다. 다른 리포지토리에서 새 버전을 가져 오면 기존 리포지토리를 덮어 쓰게됩니다. 리포지토리 외부에 링크하는 이유는 무엇입니까?
Carl Norum

2
Git은 저장소 외부의 경로를 가리키는 심볼릭 링크를 인식합니다.
mipadi

mipadi가 없습니다. 유일한 방법은 repo의 파일과 "실제"위치의 symjbolic 링크를 흔드는 것입니다
Alfredo Palhares

답변:


88

Git의 디렉터리를 나타내는 'tree'개체는 파일 이름과 (하위 집합) 권한을 저장합니다. inode 번호 (또는 다른 종류의 파일 ID)는 저장하지 않습니다. 따라서 하드 링크 적어도 metastore 또는 git-cache-meta 와 같은 타사 도구 없이는 git로 표현할 수 없습니다 (이러한 도구로도 가능할지 확실하지 않습니다).

Git은 업데이트 할 필요가없는 파일을 건드리지 않으려 고하지만, git이 하드 링크를 보존하려고하지 않기 때문에 git에 의해 깨질 수 있다는 점을 고려해야합니다.


저장소 외부를 가리키는 심볼릭 링크에 대해 : git에는 문제가 없으며 심볼릭 링크의 내용을 보존해야합니다 ... 그러나 이러한 링크의 유틸리티는 해당 심볼릭 링크가 깨 졌는지 여부가 git 저장소 외부 의 파일 시스템 레이아웃에 달려 있기 때문에 나에게 모호 합니다. , git의 통제하에 있지 않습니다.


4
저장소 외부의 경로에 대한 심볼릭 링크가 유용 할 수 있습니다. 웹 앱에서 리포지토리에서 추적하지 않는 데이터베이스 또는 미디어 파일을 가리 키도록 사용했습니다. 이렇게하면 웹앱의 구성 파일이 정적 경로를 가리킬 수 있지만 해당 경로의 실제 위치는 로컬 개발 환경과 서버 환경에 따라 다를 수 있습니다.
mipadi

@mipadi : BTW. 최신 gitweb은 정규화 후 리포지토리 외부에 심볼릭 링크를 표시하는 특별한 경우를 가지고 있습니다.
Jakub Narębski

6
네, 저장소 외부의 심볼릭 링크는 괜찮습니다. 버전 관리가 필요하지 않거나 원하지 않는 방대한 데이터 디렉토리를 가리키는 데 사용했습니다. 일반적으로 나는 상대 링크를 사용합니다. 따라서 리포지토리와 데이터 디렉토리가 일부 상위 디렉토리에서 나란히 있어야 할 수 있습니다. ../foo에 대한 심볼릭 링크를 사용하여 놀라운 트릭을 수행 할 수 있습니다.
아드리안 Ratnapala

불행히도 메타 스토어 용 Git 저장소 (git : //git.hardeman.nu/metastore.git)는 더 이상 사용할 수 없습니다.
Derek Mahar 2011

1
github.com/danny0838/git-store-metagit-cache-meta 의 대안 입니다.
Derek Mahar

22

후크를 사용 git pull하여 스크립트 이벤트 핸들러를 .git/hooks/post-merge파일에 작성하여 이벤트를 캡처 할 수 있다는 것을 알았습니다 .

첫째, 당신은 chmod +x그것을 해야 합니다.

그런 다음 그 ln안에 명령을 넣어 각 풀에서 하드 링크를 다시 만듭니다. 깔끔하네요!

작동합니다. 프로젝트에 필요 ls -i했고 파일이 자동으로 연결되었음을 보여줍니다.pull .


나의 예 .git/hooks/post-merge :

#!/bin/sh
ln -f $GIT_DIR/../apresentacao/apresentacao.pdf $GIT_DIR/../capa/apresentacao.pdf
ln -f $GIT_DIR/../avaliacoesMono/avaliacao_monografias_2011_Nilo.pdf $GIT_DIR/../capa/avaliacoes.pdf
ln -f $GIT_DIR/../posters/poster_Nilo_sci.pdf $GIT_DIR/../capa/poster.pdf
ln -f $GIT_DIR/../monografia/monografia_Nilo.pdf $GIT_DIR/../capa/monografia_Nilo.pdf

중요 : 보시다시피 저장소의 파일 경로는로 시작해야하며 파일에 $GIT_DIR부분 상대 경로를 추가 해야합니다 .

또한 중요합니다. -f 합니다. 대상 파일을 다시 만들고 있기 때문에이 필요합니다.

편집하다

최신 git 클라이언트는 원격 위치로 푸시 한 다음 복제 할 때에도 저장소 내부의 심볼릭 링크 및 하드 링크를 자연스럽게 지원하는 것 같습니다. 그래도 git repo 외부에 연결할 필요가 없었습니다 ...

$ mkdir tmp
$ cd tmp
$ git --version
git version 2.24.3 (Apple Git-128)
$ git init .
Initialized empty Git repository in /Users/teixeira/tmp/.git/
$ mkdir x
$ cd x
$ echo 123 > original
$ cat original
123
$ cd ..
$ ln -s x/original symlink
$ cat symlink
123
$ ln x/original hardlink
$ cat hardlink
123
$ git add .
$ git commit -m 'Symlink and hardlink commit'
[master (root-commit) 8df3134] Symlink and hardlink commit
 3 files changed, 3 insertions(+)
 create mode 100644 hardlink
 create mode 120000 symlink
 create mode 100644 x/original

로컬 git 저장소에서 복제

$ cd
$ git clone tmp/ teste_tmp
Cloning into 'teste_tmp'...
done.
$ cd teste_tmp/
$ ls
hardlink  symlink  x
$ cat symlink
123
$ cat hardlink
123

원격 저장소에서 복제

$ cd ~/tmp
$ git remote add origin https://github.com/myUser/myRepo.git
$ git push origin master
Enumerating objects: 5, done.
Counting objects: 100% (5/5), done.
Delta compression using up to 8 threads
Compressing objects: 100% (2/2), done.
Writing objects: 100% (5/5), 361 bytes | 361.00 KiB/s, done.
Total 5 (delta 0), reused 0 (delta 0)
To https://github.com/myUser/myRepo.git
 + 964dfce...8df3134 master -> master
$ cd ../
$ git clone https://github.com/myUser/myRepo.git
Cloning into 'myRepo'...
remote: Enumerating objects: 5, done.
remote: Counting objects: 100% (5/5), done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 5 (delta 0), reused 5 (delta 0), pack-reused 0
Unpacking objects: 100% (5/5), done.
$ cd myRepo/
$ cat symlink
123
$ cat hardlink
123

https://github.com/mokacoding/symlinks 도 중요한 점을 지적합니다. 심볼릭 링크는 상대적으로 정의되어야합니다.


11
따라서 리포지토리에 하드 링크를 추가 할 때마다 병합 후 후크 스크립트에 수동으로 행을 추가해야하는 것처럼 보입니다. 커밋 전 후크가이를 완전 자동으로 만들어 커밋에서 하드 (및 기호) 링크를 감지하고 병합 후 파일에 적절한 줄을 작성하면 좋을 것입니다. Git은 리포지토리에 inode 정보를 저장할 필요가 없으며 후크에 정보를 저장합니다! 하지만 링크 된 파일이 다른 git 저장소에서 추적된다면 얼마나 엉망이 될까요? 한곳의 파일에 대한 편집이 다른 저장소로 원활하게 전파 될까요? 원형 푸시 / 풀 루프와 영구 병합?
hobs

영리한 접근 방식이지만 Git이 하드 링크를 추적하지 않고 잠재적으로 하드 링크를 지원하지 않는 파일 시스템의 복사본으로 나타낼 수 있다는 것은 유감입니다.
Derek Mahar 2011

1
@hobs 답장하는 데 7 년이 걸린 것에 대해 죄송합니다. :) 맞습니다. 저장소 외부의 파일이 2 개의 다른 저장소에 의해 링크 된 경우 한 저장소에서 링크를 변경하는 것은 다른 저장소에서 볼 수 없을 것이라고 생각합니다.
Niloct

8

msysgit 문제에서

정션 포인트는 심볼릭 링크가 아닙니다. 따라서 심볼릭 링크는 msysGit에서 단순히 지원되지 않습니다.

또한 하드 링크는 Git에 의해 추적되지 않았습니다 .

문제는 Windows 지향 (msysgit에 관한 것이기 때문에)이었고 symlink의 잠재적 지원에 대한 토론이었습니다.
그러나 하드 링크에 대한 의견은 일반적으로 Git에 관한 것입니다.


2

Google 'git preserve hard links'는 git이 아마도 의도적으로 하드 링크 구조 AFAIK를 보존하는 방법을 모른다는 것을 보여줍니다.

내 웹 프로젝트는 다음과 같이 하드 링크를 사용합니다.

www/products/index.php
www/products/dell_latitude_id577/index.php #(hard linked to above)
www/products/dell_inspiron_id323/index.php #(hard linked again to above)

me@server:www/products$ ls -l index.php
-rwxr-xr-x 3 me me 1958 Aug 22 22:10 index.php*

index.php를 변경하고 싶다면 한 곳에서 변경하고 하드 링크 (제품 세부 정보 페이지)는 변경 사항을 가리 킵니다. 단, git은 다른 컴퓨터에서 복제 및 가져 오는 동안이 관계를 유지하지 않습니다.

me@server:www$ git pull

다른 컴퓨터에서 각 하드 링크에 대해 새로운 index.php를 생성합니다.


7
웹앱에서 일종의 라우팅을 구현해야합니다. 하드 링크는 기괴합니다.
Nowaker 2012-07-02

5
예, 최소한 심볼릭 링크를 사용하십시오. :)
안드레스 Riofrio

2
이것은 실제로 내가 원하는 것이며, git이 하드 링크를 보존하는 것을 원하지 않습니다. 많은 작업 공간 디렉토리가있는 Jenkins 디렉토리가 있으며 다중 분기 파이프 라인으로 인해 많은 중복이 있습니다. 그래서 디스크 공간을 확보하기 위해 hardlink --ignore-time에서 실행되는 야간 작업이 /var/lib/jenkins있습니다. 낮에는 일부 파일이 후 다시 unhardlinked 얻을 git pull또는 mvn compile하지만 좋아, 나는 그런 일이 기대된다. 자식이 하드 링크를 보존한다면 내 디스크 공간 재활용 전략이 작동하지 않을 것입니다.
Amedee Van Gasse
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.