여러 저장소에 걸쳐 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 래퍼인 를 사용하므로 alias git=hubmy를 그것으로 바꾸고 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 프런트엔드에도 영향을 미칩니다.

관련 정보