Close

Dot 파일: 베어(bare) Git 리포지토리에 저장하는 가장 좋은 방법

참고: 제목이 약간 과장되어 있으며 문제에 대한 다른 검증된 해결책이 있습니다. 그래도 아래 기법은 아주 훌륭하다고 생각합니다.

최근에 Hacker News 스레드에서 dot 파일을 저장하는 방법에 대한 이 놀라운 기법에 대해 읽었습니다. 사용자인 StreakyCobra훌륭한 설정을 보여줬으며 정말 효과적이었습니다! 저도 시스템을 같은 기법으로 전환하는 과정에 있습니다. 유일한 전제 조건은 Git을 설치하는 것입니다.

그의 말에 따르면 기법에는 다음이 필요합니다.

추가 도구나 심볼릭 링크가 없고, 파일이 버전 제어 시스템에서 추적되고, 컴퓨터마다 다른 브랜치를 사용할 수 있고, 새로 설치할 때도 구성을 쉽게 복제할 수 있음.

이 기법에는 Git 베어 리포지토리를 "사이드" 폴더(예: $HOME/.cfg또는 $HOME/.myconfig)에 다른 Git 리포지토리에 방해가 되는 일반적인 .git 로컬 폴더가 아닌 해당 리포지토리에 대해 명령이 실행되도록 특별히 제작된 별칭을 사용하여 저장하는 것이 포함됩니다.


처음부터 시작하기


이전에 Git 리포지토리에서 구성을 추적해 본 적이 없는 경우 다음 줄을 사용하여 이 기법을 손쉽게 사용할 수 있습니다.

git init --bare $HOME/.cfg
alias config='/usr/bin/git --git-dir=$HOME/.cfg/ --work-tree=$HOME'
config config --local status.showUntrackedFiles no
echo "alias config='/usr/bin/git --git-dir=$HOME/.cfg/ --work-tree=$HOME'" >> $HOME/.bashrc
  • 첫 번째 줄은 파일을 추적하는 Git 베어 리포지토리~/.cfg 폴더를 만듭니다.
  • 그런 다음 구성 리포지토리와 상호 작용할 때 일반 git 대신 사용할 별칭 config를 만듭니다.
  • 아직 명시적으로 추적하지 않은 파일을 숨기기 위해 리포지토리에 로컬 플래그를 설정합니다. 나중에 config status 및 기타 명령을 입력할 때 추적하고 싶지 않은 파일이 untracked 상태로 표시되지 않도록 하기 위한 것입니다.
  • 또한 별칭 정의를 .bashrc에 직접 추가하거나 편의를 위해 제공된 네 번째 줄을 사용할 수 있습니다.

위의 줄을 Bitbucket의 스니펫에 패키징하고 짧은 URL에서 연결했습니다. 그러면 다음과 같이 설정할 수 있습니다.

데이터베이스
관련 자료

전체 Git 리포지토리를 이동하는 방법

Bitbucket 로고
솔루션 보기

Bitbucket Cloud에서 Git에 대해 알아보기

curl -Lks http://bit.do/cfg-init | /bin/bash

설정을 실행한 후 다음과 같이 git을 새로 만든 config 별칭으로 대체하여 $HOME 폴더 내의 모든 파일을 일반 명령을 사용하여 버전을 지정할 수 있습니다.

config status
config add .vimrc
config commit -m "Add vimrc"
config add .bashrc
config commit -m "Add bashrc"
config push

dot 파일을 새 시스템에 설치(또는 이 설정으로 마이그레이션)


구성/dot 파일을 이미 Git 리포지토리에 저장한 경우 새 시스템의 다음 단계에 따라 이 설정으로 마이그레이션할 수 있습니다.

  • 설치하기 전에 .bashrc 또는 .zsh에 별칭을 커밋했는지 확인하세요.
alias config='/usr/bin/git --git-dir=$HOME/.cfg/ --work-tree=$HOME'
  • 소스 리포지토리는 복제할 폴더를 무시하므로 재귀 문제가 발생하지 않습니다.
echo ".cfg" >> .gitignore
  • 이제 $HOME의 "dot" 폴더에 있는 베어 리포지토리에 dot 파일을 복제합니다.
git clone --bare <git-repo-url> $HOME/.cfg
  • 현재 셸 범위에서 별칭을 정의합니다.
alias config='/usr/bin/git --git-dir=$HOME/.cfg/ --work-tree=$HOME'
  • 베어 리포지토리에서 $HOME으로 실제 콘텐츠를 체크아웃합니다.
config checkout
  • 위의 단계는 다음과 같은 메시지와 함께 실패할 수 있습니다.
error: The following untracked working tree files would be overwritten by checkout:
    .bashrc
    .gitignore
Please move or remove them before you can switch branches.
Aborting

$HOME 폴더에 이미 Git이 덮어쓸 스톡 구성 파일이 있을 수 있기 때문입니다. 해결책은 간단합니다. 파일이 중요하면 백업하고 필요하지 않으면 제거합니다. 문제가 되는 파일을 자동으로 백업 폴더로 옮길 수 있는 대략적인 바로 가기를 제공합니다.

mkdir -p .config-backup && \
config checkout 2>&1 | egrep "\s+\." | awk {'print $1'} | \
xargs -I{} mv {} .config-backup/{}
  • 문제가 있는 경우 체크아웃을 다시 실행합니다.
config checkout
  • 이 특정 (로컬) 리포지토리에서 showUntrackedFiles 플래그를 no로 설정합니다.
config config --local status.showUntrackedFiles no
  • 모두 완료되었으며 이제부터는 config 명령을 입력하여 dot 파일을 추가하고 업데이트할 수 있습니다.
config status
config add .vimrc
config commit -m "Add vimrc"
config add .bashrc
config commit -m "Add bashrc"
config push

다시 설명하자면 설정하려는 새 컴퓨터에서 이 모든 단계를 기억하지 않아도 되는 바로가기로, 간단한 스크립트를 만들어 저와 마찬가지로 Bitbucket 스니펫으로 저장하고 짧은 URL을 만들어 다음과 같이 호출하면 됩니다.

curl -Lks http://bit.do/cfg-install | /bin/bash

마무리 단계에서는 다음과 같은 결과를 얻었습니다(이를 테스트하기 위해 새로 만든 여러 Alpine Linux 컨테이너에서 테스트됨).

git clone --bare https://bitbucket.org/durdn/cfg.git $HOME/.cfg
function config {
   /usr/bin/git --git-dir=$HOME/.cfg/ --work-tree=$HOME $@
}
mkdir -p .config-backup
config checkout
if [ $? = 0 ]; then
  echo "Checked out config.";
  else
    echo "Backing up pre-existing dot files.";
    config checkout 2>&1 | egrep "\s+\." | awk {'print $1'} | xargs -I{} mv {} .config-backup/{}
fi;
config checkout
config config status.showUntrackedFiles no

마무리


이 기법이 구성을 추적하는 데 도움이 되길 바랍니다. 궁금한 점이 있는 경우 제 dot 파일은 여기에 있습니다. @durdn 또는 제 훌륭한 팀 @atlassiandev를 팔로우하여 지속적으로 소통하세요.


이 문서 공유
다음 토픽

여러분께 도움을 드릴 자료를 추천합니다.

이러한 리소스에 책갈피를 지정하여 DevOps 팀의 유형에 대해 알아보거나 Atlassian에서 DevOps에 대한 지속적인 업데이트를 확인하세요.

도구로 가득한 벽을 사용하여 협업하는 사람들

Bitbucket 블로그

DevOps 일러스트레이션

DevOps 학습 경로

Atlassian 전문가와 함께 하는 Demo Den 기능 데모

Bitbucket Cloud가 Atlassian Open DevOps와 작동하는 방법

DevOps 뉴스레터 신청

Thank you for signing up