~ 소스 제어에 대한 팁


77

많은 설정 파일 (.gitconfig, .gitignore, .emacs 등)이 있기 때문에 홈 디렉토리 (~)를 소스 제어 (이 경우 git) 아래에 놓고 싶습니다. Git에 넣으면 검색하기에 좋습니다.

내 주요 컴퓨터는 내 MacBook이고 OS X가 설정되는 방식에는 무시하고 싶은 폴더가 많이 있습니다 (문서, 다운로드, .ssh). 이미 Git (.emacs.d)을 사용하고있는 폴더도 있습니다.

내 생각은이 모든 디렉토리를 내 .gitignore 파일에 추가하는 것이었지만, 다소 번거롭고 예상치 못한 결과를 초래할 수 있습니다. 내 생각은 집에있는 폴더에 저장하려는 파일을 주기적으로 복사 한 다음 해당 폴더를 커밋하는 것입니다. 문제는 커밋하기 전에 이동해야한다는 것입니다.

이것을 할 수있는 깨끗한 방법이 있습니까?


원하는 폴더를 커밋하고 cronjobs를 통해이를 호출하는 스크립트를 만들 수도 있습니다.
— Shadok

Mac OS X의 기본 HFS + 파일 시스템은 대소 문자를 구분하지 않지만 대소 문자를 구분하지만 파일 경로는 사용자 공간에서 정식으로 분해 된 UTF-8로 인코딩됩니다. 자세한 내용은 <a href=" stackoverflow.com/questions/5581857/… 및 Mac OS X의 Umlaut 문제</a>를 참조하십시오.

답변:


60

나는 $HOME자식 밑에있다. 내 .gitignore 파일의 첫 번째 줄은

/*

나머지는 !수정자를 사용하여 무시하지 않는 패턴 입니다. 이 첫 번째 줄은 기본값이 내 홈 디렉토리의 모든 파일을 무시한다는 것을 의미합니다. 버전 관리를 원하는 파일은 다음 .gitignore과 같습니다.

!/.gitignore
!/.profile
[...]

내가 가진 까다로운 패턴은 다음과 같습니다.

!/.ssh
/.ssh/*
!/.ssh/config

즉, 나는 버전을 .ssh/config만들고 싶습니다. .ssh의 키와 다른 파일이 git에 들어가는 것을 원하지 않습니다. 위는 내가 그것을 달성하는 방법입니다.

편집 : 모든 경로의 시작에 슬래시를 추가했습니다. 이를 통해 무시 패턴이 리포지토리의 맨 위 ($ HOME)에서 일치하지 않습니다. 예를 들어 !lib/패턴 인 경우 (lib 디렉토리의 모든 것을 무시하지 마십시오) 파일을 추가하면 .gitignore이전에 패턴 ( !.gitignore)이 해당 패턴과 일치했습니다. 슬래시 ( !/.gitignore) .gitignore를 사용하면 하위 디렉토리가 아닌 내 홈 디렉토리 에서만 일치 합니다.

이것이 무시 목록과 실질적인 차이를 만드는 경우를 보지 못했지만 기술적으로 더 정확한 것으로 보입니다.


1
훨씬 더 쉬운 방법 으로 달성 할 수있을 것 같습니다 .
— Nick Volynkin

24

내가 동일한 작업을 수행하는 것은 구성 파일을 하위 디렉토리에 넣고 ~/lib홈 디렉토리에 기호 링크를 갖는 것입니다 (예 :) .emacs -> lib/emacs/dot.emacs. 명시 적으로 작성한 구성 파일 만 버전 제어하에 유지합니다. 내 홈 디렉토리에는 버전 제어가없는 많은 자동 생성 도트 파일이 포함되어 있습니다. 따라서 ~/lib버전 제어하에 있으며 내 홈 디렉토리가 없습니다.

의 파일에서 심볼릭 링크를 만드는 스크립트가 있습니다 ~/lib. 새 컴퓨터에서 계정을 만들 때 ~/lib해당 스크립트를 체크 아웃 하고 실행 하여 계정을 채 웁니다 .

내 경험은 자식이 아닌 CVS에 관한 것이므로 100 % 양도 할 수는 없습니다. CVS에 직접 홈 디렉토리를 두지 않은 이유 중 하나는 홈 디렉토리 ~/.cvsignore뿐만 아니라 모든 CVS 체크 아웃에 적용되기 때문 입니다. 자식은이 문제가 없습니다. 버전 제어하에 홈 디렉토리를 갖는 것과 비교하여 그 접근법의 단점 git status은 명시 적으로 무시하기로 결정한 파일 (무시 파일에 나열되어 표시되지 않음)과 파일을 구별 하는 데 사용할 수 없다는 것입니다 에 대한 의견이없는 파일 (로 표시됨 ?).

일부 파일은 시스템마다 달라야합니다. 이 파일을 디렉토리에 넣고 ~/Local/SITENAME/lib심볼릭 링크를 만들거나 (지원하는 파일 형식의 경우) 아래에 파일에 include 지시문이 있습니다 ~/lib. 또한 심볼릭 링크가 ~/Here -> ~/Local/SITENAME있습니다. CVS와 달리 git은 대부분 유사하지만 동일하지 않은 리포지토리를 지원하도록 설계되었으므로 머신 별 파일을 관리하는 더 좋은 방법이있을 수 있습니다. 내 도트 파일 중 일부는 실제로 심볼릭 링크가 아니라 ~/lib및의 콘텐츠에서 자동으로 생성됩니다 ~/Here.


아마도 당신은 core.excludesfile = 가있을 것~/.gitignore 입니다. 이러한 구성이 없으면 파일은 저장된 저장소를 제외한 모든 저장소에 적용되지 않습니다 ~/.git(그러면 하위 저장소에는 적용되지 않음). core.excludesfile = ~/.git-user-excludes을 사용 하여 위치에 관계없이 모든 Git 리포지토리에 적용하려는 제외와 홈 디렉토리를 보유하는 리포지토리에 적용하려는 제외 간의 충돌을 피합니다.
— Chris Johnsen

@Chris : 나는 자식에 대해 거의 알지 못한다. gitignore맨 페이지 에서 다음 문장을 이해하지 못했을 수 있습니다 .“패턴은 경로와 동일한 디렉토리 또는 상위 디렉토리 (…)에서 .gitignore 파일에서 읽습니다. 실제로 체크 아웃 루트에서 중지합니까 .git디렉토리)입니다?
— Gilles

1
그렇습니다. .gitignore파일에 대한 상향 검색 은 작업 트리의 루트에 의해 제한됩니다. 인용 한 문장은“(작업 트리의 최상위 수준까지)”입니다.
— Chris Johnsen

@Chris : 매뉴얼 페이지의 내 버전에는 이러한 단어가 없습니다. 문구가 명확 해 보입니다. 내 대답을 수정했습니다. 감사!
— Gilles


11

Git의 기능을 사용하여 파일이 목록에 있더라도 계속 추적 할 수 있습니다 .gitignore. 따라서 이것은 충분합니다 .gitignore.

$ cat .gitignore
/*

추적하려는 각 파일에 대해 다음을 실행하십시오 add -f( -f매개 변수는 in .gitignore및을 무시 함 .git/info/exclude).

git add -f .gitignore
git add -f .profile
git add -f .zshrc
git add -f .ssh/config

파일을 인덱싱하면 Git은 파일이 무시된다는 사실에도 불구하고 모든 변경 사항을 추적합니다. 디렉토리에서도 동일하게 작동하지만 실제로 존재하는 파일에만 적용됩니다.

git add -f somedirname

모든 새 파일 이 포함 된 전체 디렉토리를 추적 .gitignore하려면 camh 의 답변에 설명 된 방식으로 해당 디렉토리를 제외 할 수 있습니다 .

!/somedirname

파일 추적을 중지하려는 경우이 명령은 파일을 Git의 색인에서 제거하지만 하드 드라이브에서 그대로 유지합니다.

git rm --cached .ssh/config

1
내가 할 수 있다면 당신에게 내 포인트를 줄 것입니다. 이 방법은 디렉토리가 아닌 파일을 추적하는 데만 사용할 수 있습니다. git이 디렉토리의 모든 파일을 추적하게하려면 .gitignore에서 해당 디렉토리를 무시해야합니다. 그렇지 않으면 해당 디렉토리의 새 파일이 새 파일로 나타나지 않습니다.
— camh

5

나는 그것을 위해 오래된 것을 사용합니다 rcs.

맨 페이지에서보세요 ci, co하고 rcs. 이 사이트들도 도움이 될 것입니다 :

예를 들어 도트 파일을 제어하는 ​​버전에 사용합니다.

ci -u .*vimrc

그리고 내가 편집하고 싶다면 :

co -l .*vimrc

나는라는 이름의 디렉토리를 만드는 것이 좋습니다 RCS당신에를 ~어딘가에 다음, 쉽게 백업 디렉토리를 할 수 있습니다.


2
rcs는 현재 날짜가 꽤 많으며 git은 rc 가하는 모든 일과 그 밖의 많은 것을 수행합니다. 서버에 리포지토리를 설정하는 오버 헤드를 원하지 않는 로컬에는 rc를 사용했지만 이제는 해당 유형의 사용을 위해 git으로 완전히 전환했습니다. cvs2git을 래핑하여 rcs 파일이있는 기존 디렉토리 계층을 git으로 변환하는 스크립트를 작성했습니다.
— Neil Mayhew

1
그렇습니다. 문제는 그 방법에 대한 팁이었습니다. 방금이 사람에게 내가 몇 년 동안 어떻게 지 냈는지 ( "날짜", 힌트, 힌트) 말 했어요. 그것이 그것을 할 수있는 유일한 합리적인 방법이라는 의미는 아닙니다.
— polemon

5

$HOME/.conf/BitBucket Mercurial 저장소에서 구성 파일을 확인했습니다 . GitHub 리포지토리도 마찬가지로 작동합니다.

~/.conf체크 아웃은 설정 파일에 심볼릭 링크를 채우는 쉘 스크립트가 포함되어 $HOME있는 각 파일을 ~/.conf. (포함을 지원하는 구성 형식의 경우 .bashrc, .inputrc, .vimrc, 등) 나는 포함 ~/.conf나는 지역 재정의를 할 수 있도록, 그것에 파일이 아닌 링크를.

일부 구성 파일의 경우 Dropbox 폴더의 파일에 심볼릭 링크하고 dropbox를 통해 공유합니다.

몇 달 동안 나는 $HOME버전 제어를 유지하려고 노력했지만 대규모 무시 목록을 관리하는 데 지 쳤고 앱을 실행하여 구성 변경 사항을 확인하는 데 지쳤으며 결과는 다른 컴퓨터에서 확인하고 싶지 않은 결과였습니다. 또는 서로 다른 버전의 데스크톱 앱에서 충돌을 해결 ~/.gconf하거나 ~/.config/monitors.xml다른 곳에서 제공하는 것을 상상할 수 있습니까 ?

개인적으로 사용자 정의하고 전역 기본값으로 여러 시스템에서 공유하려는 구성 파일 목록을 심볼릭 링크하거나 포함하는 것이 더 쉽다는 것을 알았습니다.



1

소스 제어하에 관련없는 폴더가있는 두 번째 직감이 좋다고 생각합니다.

여기에 2 개의 쉘 스크립트를 추가하십시오. 하나는 제어하에 파일을 복사 ~하고 다른 하나 ~는 소스 제어 폴더 에서 파일을 수집 하고 다시 복사하여 커밋합니다.


0

다음은 새 머신을 설정하는 데 사용되는 작은 루비 스크립트입니다.

#!/usr/bin/env ruby
# setup.rb

#list of dirs which you don't want to symlink
ignored = %w(.gitignore .gitmodules misc setup.rb readme)

current_dir = File.expand_path(Dir.pwd)
home_dir = File.expand_path("~")

links = `git ls-tree --name-only HEAD`.lines.map(&:strip).select {|x| !ignored.include?(x)  }

links.each do |link|
  link = File.join(current_dir, link)
  symlink = File.join(home_dir, File.basename(link))
  `ln -ns #{link} #{symlink}`
end
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.