도트 파일을 심볼릭 링크하는 대신 $ HOME을 git에 넣는 데 문제가 있습니까?


38

나는 몇 년 동안 전체 $HOME디렉토리를 subversion으로 체크인했습니다. 여기에는 모든 도트 파일과 응용 프로그램 프로파일, 많은 스크립트, 도구 및 해킹, 선호하는 기본 홈 디렉토리 구조, 몇 가지 이상한 프로젝트가 아닌웨어 하우스 가치가있는 임의의 데이터가 포함되었습니다. 이것은 좋은 일이었습니다. 그것이 지속되는 동안.

그러나 손에서 벗어났습니다. 기본 체크 아웃은 수십 개의 시스템에서 동일하지만 모든 머신에 적합한 것은 아닙니다. 심지어 다른 배포판으로도 잘 플레이되지는 않습니다.

나는 집을 정리하는 과정에 있습니다. 데이터가 속한 곳을 분리하고, 스크립트를 별도의 프로젝트로 분리하고, 끊어진 링크를 자동화 해야하는 부분에 수정하는 등

내 의도는 의 최상위 체크 아웃 으로 교체 subversion하는 것이지만 점 파일, 몇 가지 디렉토리 및 일부 기본 사용자 정의 스크립트를 의미하는 모든 내 시스템에서 갖고 싶은 것만으로 이것을 분석하고 싶습니다.git$HOME

온라인에서 많은 사람들이 symlink 접근 방식을 사용하여이 작업을 수행하는 것 같습니다. 하위 디렉토리로 복제 한 다음 $HOME저장소로 심볼릭 링크를 만듭니다 . 나의했다 데 $HOME10 년 이상 풀 버전 제어하에,이 aproach의 아이디어를 좋아하지 않는 사람들이 바로 체크 아웃 방법 너무 싫어 보이는 이유를 알아낼 수 없습니다. 최고 수준의 체크 아웃으로 특정해야 할 함정 git$HOME있습니까?

PS 부분적으로 좋은 코딩 연습으로, github에서 루트 체크 아웃을 공개 할 계획입니다. 다시 생각하지 않고 공유 할 수있는 파일에서 수집 할 수있는 보안에 민감한 정보가 얼마나 무섭습니까! WiFi 비밀번호, 비 암호화 RSA 키 등.


5
$ HOME을 다시 생각없이 공유 할 수 있어야한다는 신념이 궁금합니다. 암호화 된 RSA 개인 키조차도 공유해서는 안됩니다.
derobert

3
실제로 홈 디렉토리의 내용을 git에 넣는 것에 대해 이야기하고 있다면 git history를 탐색하고 민감한 항목을 조심스럽게 제거하는 것은 어렵지만 불가능하지는 않습니다 (git은 물건을 잃지 않도록 설계되었습니다). 또한 분기 또는 체크 아웃을 전환하면 이전 개정판 git이 파일의 권한을 644체크 아웃 후 변경하여 개인 ssh 키와 같은 경우에 나쁘다는 것을 기억하십시오. 그러나 etckeeper/ etc /에 대한 권한으로 git을 사용하는 솔루션입니다
cwd

@derobert : 잘 알고 있습니다. 나는 $ HOME을 공개하고 점 파일과 편의 스크립트를 만드는 것에 대해 이야기하지 않았습니다. 그것들은 내가 소유하지 않은 물건을 찾은 곳입니다. 그리고 그래, 난 내를 공유 할 수 있어야한다 .zshrc, .vimrc비슷한 일이 먼저 살균하지 않고도!
Caleb

4
그것을 보지 못했다면, vcs-home wiki와 메일 링리스트를 보아라. 기본적으로 사람들이 정확히 이것을 논의하는 사람들-$ HOME을 개정 관리하에 유지하는 방법.
Jim Paris

나는 당신이 git의 행동을 얼마나 많이 바꿀 수 있는지 모르겠지만, 적어도 데비안 저장소에서 작동하는 방식은 추적 / 추적되지 않은 / 수정 된 파일을 검색 할 때 매우 탐욕스럽고 자동으로 모든 파일에 대한 책임감을 느낍니다. mrb는 이미 이것을 언급했습니다. 때로는 상대적으로 작은 프로젝트 에서도이 탐욕스러운 행동에 짜증이납니다. 홈 디렉토리에서는 원하지 않습니다. 왜 git을 사용하고 싶습니까? 또한 버전 관리 시스템을 사용하여 호스트간에 구성 파일을 동기화하고 있으며 CVS는 매우 간단하기 때문에 매우 만족합니다! Git은 매우 강력하다
Bananguin

답변:


17

, git걱정하지 않는 홈 디렉토리를 관리 할 때 적어도 하나의 주요 함정 이 subversion있습니다.

힘내는 기본적으로 탐욕스럽고 재귀 적 입니다.

Subversion은 알지 못하는 것을 순진하게 무시하며 알지 못하는 폴더에 도달하거나 다른 저장소에 속한 폴더에 도달하면 체크 아웃에서 폴더 처리를 중지하거나 중지합니다. 반면에 Git은 네임 스페이스 문제로 인해 중첩 된 체크 아웃을 매우 복잡하게 만드는 모든 하위 디렉토리로 계속 재귀됩니다. 홈 디렉토리는 다양한 git 리포지토리를 체크 아웃하고 작업하는 장소 일 가능성이 높으므로 git에 홈 디렉토리를 두는 것은 인생을 불가능한 혼란스럽게 만들 것입니다.

결과적으로 사람들이 도트 파일을 격리 된 폴더로 체크 아웃 한 다음 심볼릭 링크로 연결하는 주된 이유입니다. 의 하위 디렉토리에서 다른 작업을 수행 할 때 방해가되지 않습니다 $HOME. 집을 Subversion으로 검사하는 것은 순전히 선호의 문제이지만 git을 사용하는 경우 필수 사항이됩니다.

그러나 대체 솔루션이 있습니다. Git은 모든 저장소 기계가 체크 아웃 작업 디렉토리와 물리적으로 분리 될 수있는 대체 폴더에 숨겨져있는 "가짜 루트"라는 것을 허용합니다. 결과적으로 git 툴킷은 혼란스럽지 않습니다. 저장소를 볼 수 없으며 작업 사본 만 볼 수 있습니다. 몇 가지 환경 변수를 설정하면 홈 디렉토리를 관리 할 때 해당 순간에 상품을 찾을 수있는 위치를 알 수 있습니다. 환경 변수를 설정하지 않으면 더 현명한 사람이 없으며 집은 고전적인 파일 자체처럼 보입니다.

이 트릭 흐름을 좀 더 부드럽게 만들기 위해 몇 가지 훌륭한 도구가 있습니다. VCS-홈 메일 링리스트는 사실상 장소가 시작하는 것 같아, 페이지에 대한이 하우투 사람들의 경험의 최대 편리한 포장이있다. 길을 따라 vcsh , mr 같은 멋진 도구가 있습니다. 홈 디렉토리를 git에 직접 유지하려면 vcsh는 거의 필수 도구입니다. 당신이 뒤에서 여러 repostories로 분할 홈 디렉토리를 끝낼 경우, 결합 vcshmr빠른 아니라 매우 더러운 방법은 한 번에 모든 것을 관리 할 수.


2
그러나 왜 .gitignore 파일에 '*'를 추가하지 않습니까? 그렇게하면 git은 이미 저장소에있는 파일을 제외한 모든 것을 무시하고을 사용하여 새 파일을 추가 할 수 있습니다 git add -f <file>.
ALiX

@ALiX : git도구는 일부 프로젝트에 대해 별도의 git repo 인 하위 디렉토리에 있더라도 여전히 홈 디렉토리 저장소에서 작업하는 것으로 간주하기 때문입니다. 이 솔루션은 전체 홈 디렉토리를 다른 모든 자식 작업으로 제한합니다.
Caleb

4
그러나 .gitignore의 '*'는 홈 디렉토리 저장소에없는 모든 파일이 무시됨을 의미합니다. 일부 하위 디렉토리에서 새 자식 저장소를 체크 아웃하면 모든 것이 여전히 예상대로 작동합니다 (생각합니다). 내가 아는 한 git 도구는 디렉토리 계층을 위로 이동하면서 첫 번째 .git 디렉토리를 찾습니다. 따라서 하위 디렉토리에서 작업 할 때 올바른 git 저장소가 사용됩니다. 물론 git의 환경 변수를 사용하는 경우 상황이 복잡해질 수 있습니다. 그러나 그렇지 않으면 왜 이것이 작동하지 않는지 알 수 없습니다.
ALiX

@ALiX가 맞습니다. 중첩 된 자식 저장소는 부모 저장소에서 자식을 무시하는 한 잘 작동하는 것처럼 보입니다. git의 환경 변수에 대한 가능한 문제 외에도이 간단한 접근 방식의 단점이 무엇인지 궁금합니다.
evanrmurphy

1
오늘 이것을 실험했습니다. 기본적으로 모든 것을 무시하지만 디렉토리를 추가하기가 훨씬 쉽기 때문에 /*보다 더 효과적 이라고 생각 합니다 *. 대신에 and (.gitignore 파일 자체의 경우) 와 같은 접두사 패턴을 git add -f사용 하여 저장소에 물건을 명시 적으로 포함시킵니다. !!/.vimrc!/.gitignore
evanrmurphy

14

전체 홈 디렉토리가 버전 제어에 체크인되는 것을 원하지 않습니다. 왜냐하면 모든 하위 디렉토리가 홈 디렉토리의 버전 제어 컨텍스트를 갖기 때문입니다. git checkout이 경우 와 같은 명령 은 실제 작업을 수행하므로 실수로 잘못된 디렉토리에서 무언가를 실행하면 문제가 발생합니다 ( git자체 또는 git을 호출하는 스크립트).

또한 원하지 않는 리포지토리에 무언가를 추가 할 가능성이 높아져서 모든 항목을 체크인했을 때 문제가되지 않았지만 이제는 문제가됩니다. 실수로 개인 키 파일을 습관적으로 추가하여 github에 푸시하면 어떻게됩니까?

말했듯이, 나는 가장 큰 단점은 실제로 기술적 인 것이 아니라 나 자신을 구하기를 원한다고 생각합니다.

symlinking : repo를 서브 디렉토리로 복제하고 업데이트가 필요한 symlink를 업데이트하는 스크립트를 가질 수 있습니다. 그러나이 스크립트에 필요한 유지 보수의 양이 스크립트의 이점보다 더 클 수도 있습니다. symlinking은 덜 작동하는 것으로 판명되었습니다.

심볼릭 링크를 사용하면 git에 체크인되는 배포 판별 또는 호스트 별 추가를 쉽게 만들 수 있습니다. symlink-update 스크립트는 호환되지 않는 플랫폼 또는 다른 호스트 용 파일을 무시하고 해당 파일 만 업데이트합니다.

다음과 같은 것 :

HOMEREPO=$HOME/homerepo
HOST=$(hostname)
UNAME=$(uname)

for dotfile in $HOMEREPO/shared/* $HOMEREPO/host-$HOST/* $HOMEREPO/uname-$UNAME/*
do
    target=$HOME/$(basename $dotfile)
    [ ! -r $target ] && ln -s $dotfile $target
done

개인적으로 : 심볼릭 링크를 사용하고 디렉토리를 심볼릭 링크하지 않습니다. 안에있는 파일 만 이를 통해 해당 디렉토리에서 사이트 로컬 변경 (예 : 파일 추가 / 제거)을 유연하게 수행 할 수 있습니다. 모든 심볼릭 링크를 손으로 다시 만들어야하기 때문에 새 시스템에서 내 계정을 설정하는 것은 지루합니다.


git내가 실행하는 모든 명령은 홈 디렉토리 자체에 대한 것이거나 커밋되지 않은 NON 디렉토리에 적어도 하나 이상 묻혀있을 것입니다. svn이 하나의 폴더 격리를 사용 하면 매우 효과적이며 10 년 동안 아무런 문제가 발생하지 않았습니다. 첫 번째 단락은 다른 것을 나타냅니다. 이것이 실제로 git작동 하는 방식의 차이 입니까?
Caleb

또한 내 구성 및 스크립트에는 이미 다른 호스트 및 플랫폼에 대한 조건부 논리가 있으므로 조건부로 스크립트를 사용하여 다른 링크를 설정하는 것은 git분기를 관리하기 쉬운 것보다 많은 이익이 아닌 것 같습니다 . 여전히 내가 놓친 것이거나 선호도가 내려 질까요?
Caleb

3
하나의 폴더 격리는 실제로 분리 git되지는 않지만 확실하지 svn않지만 예를 들어 git init foo && mkdir -p foo/bar/baz/spam && cd foo/bar/baz/spam && git status다른 git 명령은 여전히 foo버전 관리 컨텍스트 에 있음을 보여줍니다 .
mrb

구성 및 스크립트 : 모든 도트 파일이 조건을 지원하는 것은 아니기 때문에 대체 방법을 제안했습니다. 이것들은 사람들이 버전 제어를 사용하지 않는 것을 선호한다고 생각하는 이유입니다. $HOME버전 관리는 점 파일 imo에게는 가치가 없지만 궁극적으로 홈 디렉토리입니다. 따라서 git을 사용하고 싶을 때 문제가되지 않습니다. 가자!
mrb

정보에 대해서 감사드립니다. 실제로 격리를 허용하지 않는 git에 대한 의견이 가장 유용한 비트입니다. 당신은 당신의 대답에 눈에 띄게 일할 수 있습니다. Subversion은이 시점에서 매우 다르게 작동하며이 사용 사례에서 중요합니다.
Caleb

5

다른 견해를 제시하기 위해 : 나는 지금부터 git 아래에 $ HOME이 있고 단점을 찾지 못했습니다. 이 git repo를 github에 동기화하지는 않습니다. 개인 저장소가있는 서비스를 사용합니다. 또한 미디어 파일이나 다운로드 또는 패키지를 git 제어하에 두지 않습니다.

  • git status 일종의 "해야 할 것, 청소하기"체크리스트입니다.

  • 나는 ~/tmp일시적인 것들을 가지고 있으며 , 이는 무시됩니다.

  • git status최근에 설치 한 소프트웨어가 $ HOME에 추가하고 종종 이러한 파일을 삭제하거나 범인을 제거하는 것이 무엇이든 보고 싶습니다 .

  • 정말 유용한 로컬 파일과 디렉토리를 수동으로 추가합니다 .gitignore.

  • 새 VM을 구축하거나 새 PC를 설치하면 원격 홈을 $ HOME에 복제하고 필요한 모든 것을 즉시 확보 할 수 있습니다.

  • vim 플러그인 용 Vundle과 같은 것은 더 이상 필요하지 않습니다.

나는 복잡성을 싫어한다. rcfile을 조정할 때, 그냥 커밋하고 푸시합니다. 그런 다음 반사적으로, 나는 격일로 $ HOME을 가져오고 항상 최신 구성을 갖습니다. 그렇게 간단합니다.

현재이 계획하에있는 기계 : 가정용 랩톱, 업무용 PC, 업무용 VM 및 3 개 또는 4 개의 원격 서버.


집 안에 다른 자식 체크 아웃이 있습니까?
Caleb

아니요, 나는 / work 디렉토리에 다른 것을 넣고 vim pugins와 같은 작은 도구를 복제하지 않습니다.
gb.

1
나는 중첩 된 자식의 repos에 문제가 없다하는 ~ / 사이트 내부의 일이뿐만 아니라이 방법을
philfreo

1
이 설정을 한동안 사용하고 있습니다. 나는 'alias sq = git status -uno'를 가지고 있으며 .gitignore를 많이 신경 쓰지 않습니다 (매번 나는 모든 균열을보고 "meh"라고 말합니다). 중첩 된 자식 저장소에 문제가 없었습니다. 개인 서버가 있는데 git init --baressh로 푸시하려고했습니다 (리포지토리에 암호를 넣지 않아도 메모 파일이 있습니다).
unhammer

5

나는 두 가지를 모두 시도 했으며 결국 symlink 접근 방식 을 선호했습니다 .

  • 어디서나 확인
  • make install
  • X 설정을로드하려면 로그 아웃했다가 다시 로그인하십시오

단점 :

  • 파일 을 추가하기 전에 파일 을 리포지토리 로 이동 해야합니다
  • Makefile에서 심볼릭 링크 목록 을 유지해야 합니다

장점 :

  • 거대한 필요가 없습니다 .gitignore( ~저의 겸손한 우분투 상자에 133 개의 도트 파일이 있습니다)
  • 유지 보수 스크립트 유지 및 기타 ~- 관련 물건 (예 : Makefilecleanup.sh) 방식의 아웃
  • 개인 및 공개 설정을 개별적으로 버전 관리 할 수 있음

제한 사항 :

  • @mrb와 달리,에서 심볼릭 링크 만 만듭니다 ~. 그렇게하면 심볼릭 링크가 단순 해지고 유지 관리 ~/.vim비용이 거의 들지 않으면 서 새 파일을 알아 차리는 것이 쉽지 .gitignore않습니다.

필자의 경우 마지막 두 가지 장점으로 인해 스케일이 향상되었습니다. 홈 디렉토리를 어지럽히고 싶지 않으며 개인 및 공개 컨텐츠를 명확하게 분리하고 싶습니다.

내가 알고있는 유일한 응용 프로그램은 심볼릭 링크를 처리하는 데 문제가 있거나 적어도 문제가 있습니다. 피진-일반 파일로 심볼릭 링크를 계속 덮어 썼습니다.


각 접근 방식의 장단점에 대한 의견을 보내 주셔서 감사합니다. 내 후속 조치에서 시작하기 위해 여분의 배선을 설정하는 것이 좋으면 두 세계를 모두 활용할 수 있는 세 번째 방법 이 있음을 발견 했습니다.
Caleb

3

다음은 하나입니다. 저장소에있는 첫 번째 커밋에서 git rebase -i --root체크인 을 시도한 경우 .gitconfig, git은 .gitconfig파일 을 일시적으로 제거 하여 이름과 이메일을 수행해야하기 때문에 리베이스 작업을 완료 할 수 없습니다. 해당 파일에 저장됩니다.

다시 구성하고 수행 할 수 git rebase --continue는 있지만 rebase 작업을 마친 후 이전에 저장소의 첫 번째 커밋이었던 커밋 전에 커밋 메시지없이 빈 커밋이 커밋되었습니다. 제거하는 방법.

git rebase -i <commit>대신 수행하면 어떻게되는지 모르겠 .gitconfig으며 이후의 커밋과 함께 체크인됩니다 <commit>.

아마도 가장 쉬운 해결책은 .gitconfig리포지토리에 추가하지 말고 대신에 나열하는 것입니다 .gitignore.


2

이것이 내가하는 방법입니다.

  1. 깨끗한 리눅스를 설치하십시오 (필요하지는 않지만 4 단계에서 인생을 더 즐겁게 만듭니다)
  2. etckeeper를 설치하십시오
  3. git init집에서 도망 치다
  4. .gitignore를 만들고 관심이없는 것처럼 보이거나 많이 변할 수있는 모든 것을 추가하십시오. 같은 것들을 추가해야합니다 *.cache, *.lock추가하지 않는 것이 좋습니다 등 I를/*집에 새로운 것이 추가되면 자동으로 알림을받지 않기 때문입니다. 블랙리스트 접근 방식과 화이트리스트 접근 방식입니다. 기본적으로 휘발성 물건과 내가 신경 쓰지 않는 일부 소프트웨어를 제외한 모든 소프트웨어에 대한 구성을 유지하려고합니다. 나중에 시스템을 병합, 마이그레이션 또는 비교할 때 모든 것을 분산시킬 수 있으면 매우 편리합니다. .bashrc와 몇 개의 다른 도트 파일을 저장하는 것보다 훨씬 빠르게 새 시스템을 설정할 수 있습니다. 이렇게하면 GUI를 통해 설정 한 구성을 유지하고 설정을 저장하는 도트 파일을 알 수 없습니다. (휘발성 파일을 커밋 한 것으로 밝혀지면 여전히 git에게 변경하지 말라고 말할 수 있습니다)
  5. 운영 etckeeper init -d /home/username
  6. 운영 git commit -d /home/username
  7. 쉘에 별명을 설정하여 다음과 같이 명령 행을 더 멋지게 만듭니다. homekeeper checkout

etckeeper를 사용하는 이유는 파일에 대한 권한과 같은 메타 데이터를 저장하기 때문입니다 (ssh 키와 같은 특정 사항에는 중요하지 않음). 이제 메타 데이터를 자동으로 저장하는 사전 커밋 후크가 있어야합니다. 체크 아웃 후 확실하지 않습니다. 아마 etckeeper checkout xxx -d /home/user좀 더 자세히 살펴 보고이 답변을 정교하게 사용해야 합니다.


-1

홈 디렉토리에서 Git을 사용할 때의 주요 문제점은 Git이 파일 권한 및 타임 스탬프와 같은 파일 속성을 저장하지 않는다는 것입니다. 나에게 특정 파일이 언제 만들어 졌는지 아는 것이 중요합니다. 또한 파일 및 디렉토리에 대한 권한을 잃어 버리는 .ssh것은 문제가됩니다. .sshGit 을 사용하지 않을 계획 이지만 권한이 중요한 다른 장소 (예 : 압축되지 않은 웹 사이트 백업)가있을 것입니다.


사실이 아니라면 오해의 소지가 있습니다. 기본적으로 Git은 권한을 포함하여 많은 파일 속성을 유지합니다. 나는 .ssh문제없이 지금 당장 git을 유지하고 있으며 적절한 보안 권한이 유지됩니다. 기본 구성에서하지 않는 것은 소유권 또는 타임 스탬프를 유지하는 것입니다. 그러나 이들 중 하나가 특정 유스 케이스에 대한 문제인 경우 이러한 추가 특성을 일반 워크 플로우의 일부로 처리 할 수있는 플러그인이 있습니다 (metastore 또는 git-cache-meta 참조).
Caleb

저장하지 않더라도 vcs에없는 홈 디렉토리를 갖는 것보다 어떻게 나쁜가요? git은 파일 변경을 요청하지 않으면 mtimes를 적극적으로 덮어 쓰지 않습니다.
poolie

-1

git 기반 솔루션은 파일을 다른 머신에 배포해야 할 때 특히 유용하며, 모든 머신에 공통적 인 부품과 일부 머신에 고유 한 부품이있는 경우 더욱 유용합니다. 여러 저장소를 만들고 multigit 또는 vcsh 와 같은 도구를 사용 하여 동일한 디렉토리 (이 경우 홈 디렉토리)에 복제 할 수 있습니다.


고마워,하지만 당신은 질문을 놓친 것 같습니다. 나는 이것 에 대한 사용법 을 잘 알고 있습니다 (따라서 처음에 그것을하고 싶었던 이유),이 질문은 git (내가 요청했을 때와 같이)로 이것을하는 새로운 누군가가 알지 못할 수도있는 함정에 관한 것입니다 . 이것은 그 질문에 전혀 대답하지 않는 것 같습니다.
Caleb
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.