Git이 저장소 외부를 가리키는 심볼릭 링크를 인식하지 못한다는 점을 고려할 때 하드 링크를 사용하는 데 문제가 있습니까?
힘내가 그들을 깰 수 있습니까? 자세한 정보를 알려 주시겠습니까?
Git이 저장소 외부를 가리키는 심볼릭 링크를 인식하지 못한다는 점을 고려할 때 하드 링크를 사용하는 데 문제가 있습니까?
힘내가 그들을 깰 수 있습니까? 자세한 정보를 알려 주시겠습니까?
답변:
Git의 디렉터리를 나타내는 'tree'개체는 파일 이름과 (하위 집합) 권한을 저장합니다. inode 번호 (또는 다른 종류의 파일 ID)는 저장하지 않습니다. 따라서 하드 링크 는 적어도 metastore 또는 git-cache-meta 와 같은 타사 도구 없이는 git로 표현할 수 없습니다 (이러한 도구로도 가능할지 확실하지 않습니다).
Git은 업데이트 할 필요가없는 파일을 건드리지 않으려 고하지만, git이 하드 링크를 보존하려고하지 않기 때문에 git에 의해 깨질 수 있다는 점을 고려해야합니다.
저장소 외부를 가리키는 심볼릭 링크에 대해 : git에는 문제가 없으며 심볼릭 링크의 내용을 보존해야합니다 ... 그러나 이러한 링크의 유틸리티는 해당 심볼릭 링크가 깨 졌는지 여부가 git 저장소 외부 의 파일 시스템 레이아웃에 달려 있기 때문에 나에게 모호 합니다. , git의 통제하에 있지 않습니다.
후크를 사용 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
$ 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 도 중요한 점을 지적합니다. 심볼릭 링크는 상대적으로 정의되어야합니다.
정션 포인트는 심볼릭 링크가 아닙니다. 따라서 심볼릭 링크는 msysGit에서 단순히 지원되지 않습니다.
또한 하드 링크는 Git에 의해 추적되지 않았습니다 .
문제는 Windows 지향 (msysgit에 관한 것이기 때문에)이었고 symlink의 잠재적 지원에 대한 토론이었습니다.
그러나 하드 링크에 대한 의견은 일반적으로 Git에 관한 것입니다.
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를 생성합니다.
hardlink --ignore-time
에서 실행되는 야간 작업이 /var/lib/jenkins
있습니다. 낮에는 일부 파일이 후 다시 unhardlinked 얻을 git pull
또는 mvn compile
하지만 좋아, 나는 그런 일이 기대된다. 자식이 하드 링크를 보존한다면 내 디스크 공간 재활용 전략이 작동하지 않을 것입니다.