2012-08-02 4 views
7

모든 dotfiles 및 config 파일을 저장할 자식 저장소를 만들려고합니다. 내 생각은 내가 관심을 갖는 모든 파일에 대한 하드 링크를 만들고 저장소에 저장할 수있는 링크를 각자의 디렉토리에 저장하는 것이었다.gitconfig 파일을 하드 링크 할 수 없습니다.

내 ~/.gitconfig 파일과 함께하다가 조금하지만 공격했습니다. 내가 'git config'명령을 실행할 때마다 내가 만든 링크가 더 이상 올바른 위치를 가리 키지 않는 것처럼 보입니다. 저장소의 파일이 더 이상 제대로 업데이트되지 않습니다.

여기 상태를 링크 된 파일을 확인하기 위해 쉘과 상호 작용하는 루비를 사용하는 예입니다.

# Create the link 
$ ln .gitconfig .conf_files/gitconfig # Create the link 

# The files are in fact linked 
[1] pry(main)> File.identical?('.gitconfig', '.conf_files/gitconfig') 
=> true 

# Update the gitconfig file by running a 'git config' command 
$ git config --global alias.last 'log -1 HEAD' 

# The files are no longer linked. 
[2] pry(main)> File.identical?('.gitconfig', '.conf_files/gitconfig') 
=> false 

나는이 자식이 .gitconfig 파일을 작성하는 방법을 함께 할 수있는 뭔가가 가정합니다. 왜 이런 일이 일어날 지 아무도 알지 못하거나 해결 방법에 대한 창의적인 아이디어가 있습니까?

+1

자식 설정은 하드 링크를 나누기. 대신 심볼릭 링크를 사용하십시오. –

+0

@William Pursell 내가 틀렸다면 고쳐주세요.하지만 자식이 심볼릭 링크를 인식하지 못한다고 생각합니까? –

+2

실제 파일을 git 저장소에두고 $ HOME에 기호 링크를 넣으십시오. 자식은 결코 부드러운 링크를 볼 수 없다. –

답변

6

http://www.xxeo.com/archives/2010/02/16/dotfiles-in-git-finally-did-it.html에서 자신의 의견에 엘리 바질 레이의 솔루션을 시도해보십시오

을 그래서 결국 모두의 최고의 소요 해결책을 발견했습니다 : 대신 심볼릭 링크의 하위 디렉토리에있는 REPO 을 넣어하는 추가 "core.worktree"에 대한 구성 옵션이 홈 디렉토리가됩니다. 이제 디렉토리에있을 때 git repo에 있지 않으므로 (첫 번째 문제는 없어집니다), 은 두 번째 경우처럼 연약한 심볼릭 링크를 다룰 필요가 없습니다. 여전히 은 버전을 원하지 않는 경로 (예 : ".git/info/exclude"트릭에서 "*")를 제외하는 번거 로움이 있지만 새로운 것은 아닙니다.

+0

위대한 작품! git 명령에 대한 git repo로 인식되는 모든 경로의 문제를 수정하고 모든 종류의 링크를 사용해야하는 문제를 피하며 파일 시스템의 루트를 어수선하게 정리할 필요가 없습니다. 방금 내 응답에서 .gitignore 파일의 내용을'.conf_files/.git/info/exclude'로 옮겼습니다. 그것은 매력처럼 작동했습니다. 이것에 대해 고마워! –

2

이 완전히 정상이며, 설정 파일을 덮어 쓸 권장되는 방법은 사실이다. 힘내는 임시 파일을 만들고 설정을 기록한 다음 새 파일을 이전 파일로 옮깁니다. 이렇게하면 Git이 중단되면 불완전한 설정 파일 (데이터 손실)이 발생하지 않습니다.

당신은 항상 복사 또는 중앙 저장소로 설정 파일을 링크하는 스크립트를 작성할 수 있습니다.

+0

하드 링크가 끊어지는 이유는 이해가되지만, 파일을 동일하게 유지하는 더 단순하고 깔끔한 방법이 있기를 바랬습니다. –

+0

@MattGarriott : 진짜 문제는 Git을 사용하여 Git 저장소 자체에있을 수없는 파일을 추적하려고한다는 것입니다. 이것은 요즘 파일 시스템이 설계되는 방식과 Git이 설계된 방식의 근본적인 한계 일뿐입니다. 나는 스크립트가 이것을 "간단하고 깨끗한"방법이라고 생각할 것이다. 힘내는 어쨌든 대본이다. 다른 방법은 Git이 저장소 외부의 파일을 추적하도록하는 것입니다. 기술적으로 가능하지만 Git 배관에 대해 알아야합니다. –

+0

당신은 절대적으로 옳습니다. 그래서 저는 다른 관점에서이 문제에 접근하기로 결정했습니다. 저는이 새로운 해결책을이 질문에 대한 답으로 붙였습니다. 모든 설명과 도움을 주셔서 감사합니다! –

0

체크 아웃이 대답은, 아마도 그것은 도움이 될 수 있습니다

한편

https://stackoverflow.com/a/3731139/1431696

, 당신은 역에있는 링크를하고 생각했다? 설정 파일들로 가득 찬 저장소를 만든 다음, 실제로 파일을 사용하는 곳에서 저장소에있는 '실제'파일에 대한 하드 링크를 생성하십시오.

+6

하드 링크는 대칭입니다. 그들은 처음부터 앞으로 나아 가지 않기 때문에 역으로 가지 않습니다. –

+0

아, 약간의 걸림돌 인 것 같습니다. – wardd

0

덕분에 디트리히 엡의 대답과 조언에 내 파일 시스템의 루트에있는 저장소를 만들고, 나는에 관심이 파일 만 추적 할 .gitignore를 사용하여 다른 각도에서이 문제에 접근하기로 결정했습니다.

내 .gitignore 파일은 이제 다음과 같습니다

별도로 파일을 복사하고이 내가 쉽게하지 않고 변경 사항을 되돌릴 수 필요로한다 이점이 두 개의 별도의 장소에 보관하지 않아도 외에도
/* 

!/etc/ 
/etc/* 

# etc files 
!/etc/rc.conf 
!/etc/asound.conf 
!/etc/mercurial/ 

!/home/ 
!/home/matt/ 
/home/matt/* 

# Home files 
!/home/matt/.xinitrc 
!/home/matt/.gitconfig 
!/home/matt/.bashrc 

# Vim files 
!/home/matt/.vimrc 
!/home/matt/.vim/ 
.netrwhist 

수동으로 파일을 복사 할 수도 있습니다.

도움 주셔서 감사합니다.

관련 문제