아래 예는 문제 자체보다는 문제의 핵심을 보여주기 위해 단순화되었습니다(내 파일 트리는 이보다 더 복잡합니다).
백업할 파일이 두 개 있다고 가정해 보겠습니다. 하나는 에 있고 ~/somedir/otherdir
다른 하나는 ~/otherdir/somedir/
. Git 저장소의 두 디렉터리에서 파일을 백업하고 싶습니다. 어떻게 해야 하나요? 소프트 링크는 실제 파일이 아닌 파일이 저장된 위치에 대한 정보만 전달하는 반면, 하드 링크는 나에게 약간 낯설습니다. 하드 링크를 사용해야 하는 경우인가요?
설명: 이 기능을 사용하려는 git
이유는 네 가지입니다. 포인트 파일/스크립트/구성의 텍스트 파일을 저장하고 시간에 따른 변경 사항을 추적하고 싶습니다. Git을 알고 있으며 이를 저장하는 데 사용할 수 있는 전용 Git 저장소가 있습니다. 여러 컴퓨터에서 이러한 파일을 공유할 수 있기를 원합니다.
답변1
파일을 옮겨도 괜찮다면...
파일을 git 저장소로 이동하고 이전 위치에 심볼릭 링크하면 됩니다.
~/gitrepo/somedir/otherdir/file1
다음에서 이동됨~/somedir/otherdir/file1
~/gitrepo/otherdir/somedir/file2
다음에서 이동됨~/otherdir/somedir/file2
~/somedir/otherdir/file1
에서 까지의 심볼릭 링크~/gitrepo/somedir/otherdir/file1
~/otherdir/somedir/file2
에서 까지의 심볼릭 링크~/gitrepo/otherdir/somedir/file2
그런 다음 git 저장소의 파일을 안전하게 커밋하고 git을 사용하여 조작할 수 있으며, 이전 파일 경로를 사용하는 모든 항목은 현재 git 작업 공간에 있는 내용을 볼 수 있습니다. 파일을 다른 방향으로 연결하거나 하드 링크를 사용하는 것은 위험합니다. 파일을 다시 쓰는 모든 git 작업(브랜치 변경, 이전 버전으로 되돌리기 등)으로 인해 링크가 끊어지기 때문입니다. (이것이 하드 링크가 실제로 실행 가능한 솔루션이 아닌 이유를 설명해주기를 바랍니다.)
이 경우 파일을 완전히 다시 작성하여 링크를 깨뜨리는 많은 텍스트 편집기와 도구를 조심해야 합니다 sed -i
. 더 안전한 접근 방식은 전체 폴더를 git 저장소로 이동하고 디렉터리를 심볼릭 링크하는 것입니다.
파일을 제자리에 유지하려면...
또 다른 가능성은 홈 디렉터리에 git 저장소를 만들고 git에게 모든 것을 무시하라고 지시한 다음 추적하려는 파일을 강제로 추가하는 것입니다.
cd
git init
echo '*' > .gitignore
git add -f .gitignore
git commit -m "Initialise repository and ignore everything"
git add -f somedir/otherdir/file1
git commit -m "Add file1"
git add -f otherdir/somedir/file2
git commit -m "Add file2"
이 작업을 수행하면 명시적으로 추가된 파일의 변경 사항을 쉽게 추적할 수 있지만 git은 새 파일을 고려하지 않습니다. 이 설정을 통과하면 됩니다~해야 한다홈 디렉토리의 하위 디렉토리에 다른 git 저장소를 두는 것도 안전하지만 자세히 확인하지는 않았습니다...
답변2
GitHub에서 도트 파일을 관리하는 방법에 대해 썼습니다.https://github.com/jesuswasrasta/dotfiles
내 솔루션에는 원본 파일 이동이 포함되지 않으며(마음에 들지 않더라도) 심볼릭 링크 등도 포함되지 않습니다. 기본 시스템은 변경되지 않고 불가지론적으로 유지됩니다.
파일 클릭
이것은 제가 사용하는 도트 파일의 개인 저장소입니다.
아이디어
내 컴퓨터에 포인트 파일을 저장, 백업 및 버전 지정하는 간결한 방법이 필요합니다(*nix 뿐만 아니라).
나는 Git을 좋아하기 때문에 DVCS를 사용하여 이를 처리한 다른 사람들을 찾아보았고 몇 가지 다른 접근 방식을 발견했습니다. 이것이 제가 찾은 것입니다.기사에서 영감을 얻음니콜라 파올루치, 전 아틀라스개발자 주도자, 그가 직접 정의한대로 :)
원본 기사는 다음과 같습니다.포인트 파일을 저장하는 가장 좋은 방법.
나는 이 아이디어를 정말 좋아한다.
명령 이름과 폴더에 대한 내 취향에 더 잘 맞도록 조금 수정했습니다.어떻게 작동하나요?
이 기술에는 포인트 파일을 저장하는 작업이 포함됩니다.네이키드 Git저장소이지만
$HOME/.dotfiles
일반.git
폴더가 아닌 사용자 정의 폴더에 있습니다. 그런 다음 특별한 Git 별칭 명령을 사용하여 저장소에서 추적하려는 파일을 추가 및 커밋하고 원격(비공개)으로 푸시할 수 있습니다.비트 버킷내 경우에는 기밀 정보를 푸시하지 않을 것이라는 확신이 들 때까지 저장소를 비밀로 유지하는 것이 좋습니다.저장소 구조
나는 각 머신마다 다른 Git 브랜치를 사용합니다.
master
브랜치에는 템플릿으로 사용하는 공통 파일만 있습니다.마스터 브랜치에는 다음이 포함됩니다.
- 일반 무시 파일
- 자주 사용하는 일반적인 쉘 별칭
- 모든 컴퓨터에 갖고 싶은 기타 공통 파일 및 구성
처음부터 시작하세요
이전에 Git 리포지토리에서 구성을 추적한 적이 없다면 다음 줄을 사용하여 이 기술을 쉽게 시작할 수 있습니다.
1) git init --bare $HOME/.dotfiles 2) alias dotfiles='/usr/bin/git --git-dir=$HOME/.dotfiles/ --work-tree=$HOME' 3) dotfiles config --local status.showUntrackedFiles no 4) dotfiles config --local core.excludesFile=.dotfilesignore 5) echo ". ~/.zsh_aliases" >> $HOME/.zshrc 6) echo "alias dotfiles='/usr/bin/git --git-dir=$HOME/.dotfiles/ --work-tree=$HOME'" >> $HOME/.zsh_aliases 7) echo "alias dfg=dotfiles" >> $HOME/.zsh_aliases
~/.dotfiles
첫 번째 줄은 파일을 추적하기 위한 기본 Git 저장소인 폴더를 만듭니다 .- 그런 다음 저장소에만 적용되도록 구성된 명령의 사용자 정의 별칭
dotfiles
에 지나지 않는 새 명령을 만듭니다 . 구성 저장소와 상호 작용할 때 일반 명령 대신 이것을 사용합니다.git
.dotfiles
git
status.showUntrackedFiles no
아직 명시적으로 추적하지 않은 파일을 숨기기 위해 저장소에 로컬 플래그를 설정했습니다 . 이렇게 하면dotfiles status
나중에 해당 명령과 다른 명령을 입력할 때 추적에 관심이 없는 파일이 추적되지 않은 것으로 표시되지 않습니다.- 일관성을 높이기 위해
.dotfilesignore
일반적인 파일 대신 사용자 지정 Git 무시 파일을 사용하고 있습니다.gitignore
. 이렇게 하면 제외 사항을 작성할 위치를 더 쉽게 기억할 수 있습니다.- 나는 일반적으로 별칭을 별도의 파일(예: )에 저장한
.zsh_aliases
다음.zshrc
다음 줄을 추가하여 포함합니다. ~/.zsh_aliases
.- 별칭 정의를 수동으로 추가하거나
dotfiles
편의를 위해 제공된 명령을 사용하십시오.- 나는 일반적으로 새로 생성된 명령에 대해
dfg
; 라고 부르는 또 다른 별칭을 만듭니다. 하지만df
Unix 상자에는 이미 명령이 있습니다 :) 그래서 약어를 선택했고 (적어도 저에게는 이렇게 말합니다) QWERTY 키보드는 세 글자가 인접해 있어 기억하기 쉽고 편리합니다.df
dot files git
dfg
Zsh 사용자로서 저는 이 예제에서
.zshrc
및 파일을 사용합니다..zsh_aliases
Bash를 선호하는 쉘로 사용하려는 경우.bashrc
자유롭게 교체할 수 있습니다.bash_aliases
. 두 파일은 동일한 방식으로 작동합니다.설치를 수행한 후
$HOME
일반 Git 명령을 사용하여 폴더의 모든 파일 버전을 관리하고git
새로 생성된dotfiles
별칭으로 바꿀 수 있습니다.dotfiles status dotfiles add .vimrc dotfiles commit -m "Add vimrc" dotfiles add .bashrc dotfiles commit -m "Add bashrc" dotfiles push
새 시스템에 도트 파일 설치
dotfiles
설치하기 전에 5), 6), 7) 단계에 따라 별칭을 제출했는지 확인하세요 .그런 다음 이상한 재귀 문제가 발생하지 않도록 저장소가 복제할 폴더를 무시하는지 확인하십시오.
echo ".dotfiles" >> .dotfilesignore
.dotfiles
이제 Dotfiles 저장소를 도트 폴더의 기본 저장소에 복제하십시오$HOME
.git clone --bare <git-repo-url> $HOME/.dotfiles
현재 쉘 범위에서 별명을 정의하십시오.
alias dotfiles='/usr/bin/git --git-dir=$HOME/.dotfiles/ --work-tree=$HOME'
베어 저장소에서 다음으로 실제 콘텐츠를 확인하세요
$HOME
.dotfiles checkout master
다음과 같은 메시지와 함께 위 단계가 실패할 수 있습니다.
error: The following untracked working tree files would be overwritten by checkout: .zshrc Please move or remove them before you can switch branches. Aborting
$HOME
이는 폴더에 Git이 덮어쓸 일부 기본 구성 파일이 이미 있을 수 있기 때문입니다 (.zshrc
제 경우처럼). 해결책은 간단합니다. 파일이 마음에 든다면 백업하고, 그렇지 않다면 삭제하세요. Nicola는 문제가 있는 모든 파일을 백업 폴더로 자동으로 이동할 수 있는 간단한 바로 가기를 제공합니다.mkdir -p .dotfiles-backup && \ dotfiles checkout 2>&1 | egrep "\s+\." | awk {'print $1'} | \ xargs -I{} mv {} .dotfiles-backup/{}
문제가 발생하면 검사를 다시 실행하세요.
dotfiles checkout master
이 특정(로컬) 저장소
showUntrackedFiles
에 플래그를 설정합니다 .no
dotfiles config --local status.showUntrackedFiles no
이 특정(로컬) 저장소
core.excludesFile
에 플래그를 설정합니다 ..dotfilesignore
dotfiles config --local core.excludesFile=.dotfilesignore
이제 두 가지 옵션이 있습니다. 설치하려는 새 시스템에 대한 새 분기를 생성하거나 기존 분기를 체크아웃하여 사용하는 것입니다.
새 지점 만들기
dotfiles checkout -b <my-new-machine-branch-name>
이 시점에서 도트 파일을 사용자 정의하고 이 새 분기에 커밋할 수 있습니다. 다른 브랜치와 파일을 비교할 수도 있고,최고를 선택하세요당신이 좋아하는 것은 다른 지점에서 왔습니다.
기존 지점 체크아웃
이전 단계에서 우리는
master
브랜치를 체크아웃했고 내 개인 도트파일 저장소에는 내가 모든 컴퓨터에 갖고 싶은 공유 파일과 구성만 포함되어 있습니다(모든 컴퓨터가 100% 동일하지는 않습니다).
하지만 원하는 모든 도트 파일을 브랜치에 커밋master
하고 항상 사용할 수 있습니다. 또는 원하는 경우 기존 파일(다른 머신)을 새 파일로 체크아웃할 수 있습니다. 다음과 같이 브랜치를 전환하면 됩니다.dotfiles checkout <existing-machine-branch-name>
물론 앞서 언급한 것처럼 몇 가지 충돌이 발생할 수 있습니다. 제공된 스크립트를 사용하여 충돌을 처리하거나 덮어쓰려는 현재 포인트 파일을 삭제하세요.
일반화하다
완료되었습니다. 이제부터
dotfiles
다음 명령을 입력하여dfg
도트 파일을 추가하고 업데이트 할 수 있습니다.dotfiles status dotfiles add .vimrc dotfiles commit -m "Add vimrc" dotfiles add .bashrc dotfiles commit -m "Add bashrc" dotfiles push
설치 스크립트
설정하려는 새 컴퓨터에서 이러한 모든 단계를 기억할 필요가 없도록 하기 위한 지름길로 다음과 같은 간단한 스크립트를 만들 수 있습니다.
git clone --bare <url-of-your-repo> $HOME/.dotfiles function dotfiles { /usr/bin/git --git-dir=$HOME/.dotfiles/ --work-tree=$HOME $@ } mkdir -p .dotfiles-backup dotfiles checkout if [ $? = 0 ]; then echo "Checked out dotfiles repository."; else echo "Backing up pre-existing dot files."; dotfiles checkout 2>&1 | egrep "\s+\." | awk {'print $1'} | xargs -I{} mv {} .dotfiles-backup/{} fi; dotfiles checkout dotfiles config --local status.showUntrackedFiles no dotfiles config --local core.excludesFile=.dotfilesignore
BitBucket 조각으로 저장했으므로 이제 다음과 같이 호출할 수 있습니다.
curl -Lks https://bitbucket.org/snippets/fsantacroce/qedGpx | /bin/bash
부록 당신이 알고 있을 수 있는 기타 사항.
버전 관리할 가치가 있는 점 파일은 무엇입니까?
답은 하나도 없고,때에 따라 다르지:)
다음은 내가 항상 포함하는 일부 파일입니다.
.dotfilesignore
, 틀림없이- 셸 구성 파일:
.zshrc
- 별칭 파일:
.zshrc_aliases
- 아 맙소사:
.oh-my-zsh/
폴더- 내가 일반적으로 사용하는 Git 구성 및 별칭은 다음과 같습니다.
.gitconfig
- ...계속...
데스크탑 환경 및 애플리케이션 포인트 파일
저는 보통 데스크탑 환경 포인트 파일의 버전을 관리하기도 합니다(보통케이드) 내가 사용하는 모든 K* 응용 프로그램의 구성은 다음과 같습니다.
.kde/
KDE 관련 내용.config/
응용프로그램의 경우 KDE가 아닌 응용프로그램이라도.local/share/
이 명령은 다음과 같습니다.
kf5-config --path config
현재 KDE 설치에 사용되는 구성 폴더를 표시합니다.
불행하게도 KDE에서는 기존 파일을 덮어쓰기 때문에 이러한 파일을 복원하는 것이 쉽지 않습니다.잘 알려진 티켓이를 위해 개발팀에서는 몇 가지 임시 조치를 시행해야 하지만, 아직까지 아무것도 구현되지 않은 것으로 이해됩니다. 그럼에도 불구하고 한 컴퓨터에서 새 컴퓨터로 마이그레이션할 때 일반적으로 필요한 컴퓨터를 직접 선택합니다(예: KDE 전역 단축키, 돌핀 사용자 정의 등).
어떤 도트 파일을 무시해야 합니까?
네 가능해요은닉처,온도그리고기계관련다음과 같이 포함할 필요가 없는(또는 포함하는 것이 위험할 수 있는) 파일:
Zsh 임시 및 캐시 파일:
**.zsh_history
.zsh_save
Bash 임시 및 캐시 파일:
**.bash_history
.bash_logout
다음과 같은 것들이 있습니다:
*.config/chromium/*
*.config/session/*
*.config/pulse/*
*.m2/*
, Maven 저장소 캐시
*.IntelliJ*/*
, IntelliJ 설정: 이것들을 위한 저장소가 설정되어 있습니다 :)
*...계속...나는 추적할 필요가 없는 것을 발견할 때마다 새 폴더와 파일을 추가합니다.
일부 /etc 파일에도 버전을 지정합니까?
/etc
항상 파일 버전을 관리 하지는 않지만 , 할 때는 버전을 관리합니다.: * Nano 구성 파일: 참조공식 매뉴얼 페이지Nano 구성 파일로 작업하는 방법과 버전 제어가 필요한 파일에 대해 알아보세요.
*...계속...
답변3
확인하다src
, 로컬 독립 파일을 위한 간단한 버전 제어 시스템입니다.