여러 저장소에 걸쳐 git 구성을 설정할 수 있나요?

여러 저장소에 걸쳐 git 구성을 설정할 수 있나요?

Git은 세 가지 수준에서 구성 값을 지원하는 것으로 보입니다.

  • 시스템별 전역 설정( 에 저장됨 /etc/git-core)
  • 사용자별 전역 설정( 에 저장됨 ~/.gitconfig)
  • 리포지토리별 로컬 설정( 에 저장됨 $REPO/.git/config)

이러한 옵션은 대부분의 기초를 다루지만 네 번째 수준을 처리할 수 있는 방법을 찾고 있습니다. user.email평소와 다른 값을 사용해야 하는 (매우) 큰 저장소 컬렉션이 있습니다 . 이러한 리포지토리는 자동화된 스크립트를 통해 생성 및 조작되는 경우가 많으며 리포지토리별로 로컬 설정을 지정하는 것이 번거롭습니다.

문제의 모든 저장소는 내 로컬 시스템의 특정 경로 접두사 아래에 있습니다. 해당 경로 아래의 모든 저장소에서 상속될 구성 값을 어딘가에 설정하는 방법이 있습니까? (일종의 유사한 .htaccess설정은 파일 시스템까지 상속됩니다.) 아마도 전역 구성 파일에 조건부 값을 설정하는 방법이 있을까요? 나와 같은 저장소 세트에 대처하기 위해 UNIX 환경에서 어떤 다른 조치를 취할 수 있습니까?

답변1

이 네 번째 수준에서 git을 구성하는 방법을 찾지 못했습니다. 유일한 방법은 를 사용하여 명령별 구성 값을 재정의하는 것 같습니다 git -c key=value.

현재 내 해키 솔루션은 git의 래퍼 역할을 하는 쉘 함수를 정의하는 것입니다. 호출되면 인수를 시스템 git 명령에 전달하지만 현재 작업 디렉터리를 확인하고 해당하는 경우 명령에 추가 인수를 추가하기 전에는 전달하지 않습니다.

function git () {
    case "$PWD" in
        /path/to/repos/*)
            command git -c [email protected] "$@"
            ;;
        *)
            command git "$@"
            ;;
    esac
}

답변2

Git 구성을 기반으로 하는 이 솔루션을 참조하세요.

https://dzone.com/articles/how-to-use-gitconfigs-includeif

"~/.gitconfig" 파일에 추가:

    [includeIf "gitdir:~/work/project1/.git"]  
      path = .gitconfig-project1  

내용이 포함된 "~/.gitconfig-project1" 파일을 만듭니다.

    [core]  
      sshCommand = "ssh -i ~/.ssh/project1 -F /dev/null"  
  
    [user]  
      name = user1  
      email = [email protected]  

답변3

환경 변수를 사용하여 git의 이메일 주소를 구성할 수 있습니다 GIT_AUTHOR_EMAIL. 이것을 결합하면디렉토리에 들어갈 때 bash 스크립트 실행또는zsh를 사용한 디렉토리별 쉘 구성디렉토리 또는 상위 디렉토리별로 설정을 쉽게 변경할 수 있습니다. 예를 들어 디렉토리에 들어가면 ~/work환경 변수를 자동으로 조정하여 이메일 주소를 변경할 수 있습니다.

답변4

Caleb의 답변을 바탕으로 git이 디렉터리의 모든 저장소를 영구적으로 올바르게 구성하는 수정된 명령을 정의하여 향후 바닐라 git을 사용할 때마다 새 구성을 사용할 수 있습니다. 나는 hub또 다른 git 래퍼인 를 사용하므로 my를 alias git=hubthis로 바꾸고 hub함수에서 호출했습니다. 을 사용하지 않으면 hub모든 hub호출을 다음으로 바꿉니다 command git.

function git() {
    case "$PWD" in
        /home/robin/git/3RD_PARTY)
            hub "$@"
            # We don't know which repository was cloned / operated on, so let's just reconfigure them all
            for f in *; do
                [[ -d "$f" ]] && hub -C "$f" config user.email $my_private_email
            done
            ;;
        /home/robin/git/3RD_PARTY/*)
            hub "$@"
            hub config user.email $my_private_email
            ;;
        *)
            hub "$@"
            ;;
    esac
}

셸에서만 작동하는 Caleb의 답변과 달리(명시적으로 소스가 제공되지 않는 한 대화형 셸에서만) 이는 emacs magit와 같이 git 구성을 올바르게 읽는 다른 git 프런트 엔드에도 영향을 미칩니다.

관련 정보