~ 소스 제어에 대한 팁


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.