도트 파일을 심볼릭 링크하는 대신 $ HOME을 git에 넣는 데 문제가 있습니까? 적합한 것은 아닙니다. 심지어 다른 배포판으로도 잘

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

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

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

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

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

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



답변

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

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

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

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

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

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


답변

전체 홈 디렉토리가 버전 제어에 체크인되는 것을 원하지 않습니다. 왜냐하면 모든 하위 디렉토리가 홈 디렉토리의 버전 제어 컨텍스트를 갖기 때문입니다. 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 아래에 $ HOME이 있고 단점을 찾지 못했습니다. 이 git repo를 github에 동기화하지는 않습니다. 개인 저장소가있는 서비스를 사용합니다. 또한 미디어 파일이나 다운로드 또는 패키지를 git 제어하에 두지 않습니다.

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

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

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

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

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

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

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

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


답변

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

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

단점 :

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

장점 :

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

제한 사항 :

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

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

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


답변

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

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

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

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


답변

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

  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좀 더 자세히 살펴 보고이 답변을 정교하게 사용해야 합니다.


답변

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