it-swarm-ko.tech

~를 소스 제어하에 놓기위한 팁

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

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

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

이 작업을 수행하는 깨끗한 방법이 있습니까?

78
Dan McClain

Git 아래에 $HOME가 있습니다. 내 .gitignore 파일의 첫 번째 줄은

/*

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

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

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

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

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

편집 : 모든 경로의 시작 부분에 슬래시를 추가했습니다. 이렇게하면 무시 패턴이 아무 곳이 아닌 저장소 ($ HOME)의 맨 위에서 일치합니다. 예를 들어, !lib/가 패턴이고 (lib 디렉토리의 모든 것을 무시하지 마십시오) .gitignore 파일을 추가하면 이전에 패턴 (!.gitignore)이 . 선행 슬래시 (!/.gitignore)를 사용하면 내 홈 디렉토리에서만 .gitignore와 일치하며 하위 디렉토리에서는 일치하지 않습니다.

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

60
camh

내가하는 일은 (동일한 목적으로) 내 구성 파일을 하위 디렉토리 ~/lib에 넣고 내 홈 디렉토리에 심볼릭 링크를 포함하는 것입니다 (예 : .emacs -> lib/emacs/dot.emacs). 버전 관리하에 명시 적으로 작성한 구성 파일 만 유지합니다. 내 홈 디렉토리에는 버전 제어를받지 않는 자동 생성 된 도트 파일이 많이 있습니다. 따라서 ~/lib는 버전 관리하에 있고 내 홈 디렉토리는 그렇지 않습니다.

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

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

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

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

$ cat .gitignore
/*

추적하려는 각 파일에 대해 add -f를 실행합니다 (-f 매개 변수는 .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
11
Nick Volynkin

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

~/.conf 체크 아웃에는 $HOME의 각 파일에 대한 ~/.conf의 심볼릭 링크를 채우기위한 구성 파일과 셸 스크립트가 포함되어 있습니다. 포함을 지원하는 구성 형식 (.bashrc, .inputrc, .vimrc 등)의 경우 링크하는 대신 ~/.conf 파일을 포함합니다. 로컬 재정의를 수행 할 수 있습니다.

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

몇 달 동안 버전 관리에 $HOME 자체를 유지하려고했지만 방대한 무시 목록을 관리하는 데 지 쳤고, 앱 실행으로 인한 구성 변경 사항을 확인하는 데 지 쳤고, 그 결과는 내가 원하는 것도 아니 었습니다. 다른 컴퓨터에서 확인하십시오. ~/.gconf 또는 ~/.config/monitors.xml에서 충돌을 수정하거나 다른 버전의 데스크톱 앱을 처리하는 것을 상상할 수 있습니까?

개인적으로 사용자 정의하고 전역 기본값으로 컴퓨터간에 공유하려는 제한된 구성 파일 목록을 심볼릭 링크하거나 포함하는 것이 더 쉽습니다.

5
Graham

이를 위해 이전 rcs을 사용합니다.

ci, corcs에 대한 맨 페이지를 참조하십시오. 이러한 사이트도 도움이 될 것입니다.

예를 들어 내 dotfile을 제어하는 ​​버전에 사용합니다.

ci -u .*vimrc

그리고 편집하려면 :

co -l .*vimrc

~RCS이라는 디렉토리를 만드는 것이 좋습니다. 그러면 해당 디렉토리를 어딘가에 쉽게 백업 할 수 있습니다.

5
polemon

방금 파일을 자동 연결하는 편리한 도구 인 다음 Python Dotfiles 스크립트를 사용하기 시작했습니다. https://pypi.python.org/pypi/dotfiles

3
trojjer

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

거기에 2 개의 셸 스크립트를 추가하기 만하면됩니다. 하나는 사용자가 제어하는 ​​파일을 ~에 복사하고 다른 하나는 ~에서 파일을 수집하여 소스 제어 폴더로 다시 복사하고 커밋합니다.

1

다음은 새 컴퓨터를 설정하는 데 사용하는 작은 Ruby 스크립트입니다.

#!/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
0