많은 설정 파일 (.gitconfig, .gitignore, .emacs 등)이 있기 때문에 내 홈 디렉토리 (~)를 소스 제어 (이 경우 git)하에두고 싶습니다. Git에 있으면 검색하기에 좋을 것입니다.
내 주 컴퓨터는 MacBook이고 OS X 설정 방식에 따라 무시하고 싶은 폴더가 많이 있습니다 (문서, 다운로드, .ssh). 이미 Git (.emacs.d)을 사용하고있는 폴더도 있습니다.
내 생각은이 모든 디렉토리를 내 .gitignore 파일에 추가하는 것이었지만, 그것은 다소 귀찮은 것 같고 잠재적으로 예기치 않은 결과를 초래할 수 있습니다. 다음으로 저장하려는 파일을 집의 일부 폴더에 주기적으로 복사 한 다음 해당 폴더를 커밋하는 것이 었습니다. 문제는 커밋하기 전에 이동해야한다는 점입니다.
이 작업을 수행하는 깨끗한 방법이 있습니까?
Git 아래에 $HOME
가 있습니다. 내 .gitignore 파일의 첫 번째 줄은
/*
나머지는 !
수정자를 사용하여 무시하지 않는 패턴입니다. 이 첫 번째 줄은 기본값이 내 홈 디렉토리의 모든 파일을 무시하는 것임을 의미합니다. 버전 관리를 원하는 파일은 다음과 같이 .gitignore
로 이동합니다.
!/.gitignore
!/.profile
[...]
내가 가진 더 까다로운 패턴은 다음과 같습니다.
!/.ssh
/.ssh/*
!/.ssh/config
즉, .ssh/config
버전 만 원합니다.-.ssh의 키와 기타 파일이 git에 들어가는 것을 원하지 않습니다. 위는 내가 그것을 달성하는 방법입니다.
편집 : 모든 경로의 시작 부분에 슬래시를 추가했습니다. 이렇게하면 무시 패턴이 아무 곳이 아닌 저장소 ($ HOME)의 맨 위에서 일치합니다. 예를 들어, !lib/
가 패턴이고 (lib 디렉토리의 모든 것을 무시하지 마십시오) .gitignore
파일을 추가하면 이전에 패턴 (!.gitignore
)이 . 선행 슬래시 (!/.gitignore
)를 사용하면 내 홈 디렉토리에서만 .gitignore
와 일치하며 하위 디렉토리에서는 일치하지 않습니다.
나는 이것이 내 무시 목록과 실질적인 차이를 만드는 경우를 보지 못했지만 기술적으로 더 정확한 것 같습니다.
내가하는 일은 (동일한 목적으로) 내 구성 파일을 하위 디렉토리 ~/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
BitBucket Mercurial 저장소에서 $HOME/.conf/
로 내 구성 파일을 확인합니다. GitHub 리포지토리도 잘 작동합니다.
~/.conf
체크 아웃에는 $HOME
의 각 파일에 대한 ~/.conf
의 심볼릭 링크를 채우기위한 구성 파일과 셸 스크립트가 포함되어 있습니다. 포함을 지원하는 구성 형식 (.bashrc
, .inputrc
, .vimrc
등)의 경우 링크하는 대신 ~/.conf
파일을 포함합니다. 로컬 재정의를 수행 할 수 있습니다.
일부 구성 파일의 경우 Dropbox 폴더에있는 파일에 심볼릭 링크하고 dropbox를 통해 공유합니다.
몇 달 동안 버전 관리에 $HOME
자체를 유지하려고했지만 방대한 무시 목록을 관리하는 데 지 쳤고, 앱 실행으로 인한 구성 변경 사항을 확인하는 데 지 쳤고, 그 결과는 내가 원하는 것도 아니 었습니다. 다른 컴퓨터에서 확인하십시오. ~/.gconf
또는 ~/.config/monitors.xml
에서 충돌을 수정하거나 다른 버전의 데스크톱 앱을 처리하는 것을 상상할 수 있습니까?
개인적으로 사용자 정의하고 전역 기본값으로 컴퓨터간에 공유하려는 제한된 구성 파일 목록을 심볼릭 링크하거나 포함하는 것이 더 쉽습니다.
이를 위해 이전 rcs
을 사용합니다.
ci
, co
및 rcs
에 대한 맨 페이지를 참조하십시오. 이러한 사이트도 도움이 될 것입니다.
예를 들어 내 dotfile을 제어하는 버전에 사용합니다.
ci -u .*vimrc
그리고 편집하려면 :
co -l .*vimrc
~
에 RCS
이라는 디렉토리를 만드는 것이 좋습니다. 그러면 해당 디렉토리를 어딘가에 쉽게 백업 할 수 있습니다.
방금 파일을 자동 연결하는 편리한 도구 인 다음 Python Dotfiles 스크립트를 사용하기 시작했습니다. https://pypi.python.org/pypi/dotfiles
소스 제어하에 관련없는 폴더를 두는 두 번째 예감이 좋다고 생각합니다.
거기에 2 개의 셸 스크립트를 추가하기 만하면됩니다. 하나는 사용자가 제어하는 파일을 ~
에 복사하고 다른 하나는 ~
에서 파일을 수집하여 소스 제어 폴더로 다시 복사하고 커밋합니다.
다음은 새 컴퓨터를 설정하는 데 사용하는 작은 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