git 구성을 여러 리포지토리에 설정할 수 있습니까?


18

힘내는 세 가지 수준에서 구성 값을 지원하는 것 같습니다 :

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

이 옵션은 대부분의 기초를 다루지 만 4 단계를 처리하는 방법을 찾고 있습니다. 나는 user.email평소와 다른 값을 사용해야하는 (매우) 큰 저장소 모음을 가지고 있습니다 . 이러한 리포지토리는 종종 자동화 된 스크립트를 통해 생성 및 조작되며 리포지토리 당 로컬 설정은 번거 롭습니다.

문제의 모든 리포지토리는 로컬 시스템의 특정 경로 접두사 아래에 있습니다. 해당 경로 아래의 모든 리포지토리에서 상속 할 구성 값을 설정하는 방법이 있습니까? (유사한 .htaccess설정은 파일 시스템 전체를 상속합니다.) 아마도 전역 설정 파일에서 조건부 값을 설정하는 방법이 있습니까? 유닉스 환경에서 저와 같은 저장소에 대처하기 위해 다른 어떤 준비를 할 수 있습니까?


내 첫 번째 반사는 스크립트를 해킹하여 .gitconfig생성하는 각 디렉토리 를 조정 하는 것입니다. 예를 들어 IIRC Android의 저장소 는이 작업을 수행 할 수 있지만 소스를주의 깊게 읽어야합니다. (나는 확실하지 않다, 나는 그것을 한동안하지 않았다.)
Gilles 'SO- 악마 그만'

@Gilles : 그럴 가능성이 있습니다. 해당 리포지토리는 최근 CVS에서 Git으로 마이그레이션 된 Linux 배포판의 패키지 리포지토리입니다. 우리는 여전히 모든 툴링을 다시 실행하고 있습니다. 장기적으로는 이것이 문제가되는 곳 일지 모르지만 단기적으로는 우리가 작업하는 사람들이 옵션이 무엇인지 실험하고 있습니다.
Caleb

답변:


11

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

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

function git () {
    case "$PWD" in
        /path/to/repos/*)
            command git -c user.email=alternate@credentials.org "$@"
            ;;
        *)
            command git "$@"
            ;;
    esac
}

내가 할 수있는 command git -c user.email=alternate@credentials.org user.name="Alter Ego" "$@"또는 내가 그것에 대해 어떻게 가야하나요? 높고 낮게 검색했으며 내가 찾은이 -c 플래그에 대한 유일한 참조는 감사합니다.
Vic Goldfeld

기록을 위해, 나는 그것을 사용했습니다command git -c user.email=alternate@credentials.org -c user.name="Alter Ego" "$@"
Vic Goldfeld

6

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


2

자식 구성을 기반으로 솔루션을 참조하십시오 :

http://gik.firetrot.com/index.php/2018/05/06/git-configuration-across-multiple-repositories/

“~ / .gitconfig”파일에 추가하십시오 :

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

내용으로“~ / .gitconfig-project1 ″ 파일을 만듭니다.

    [core]  
      sshCommand = "ssh -i ~/.ssh/project1 -F /dev/null"  

    [user]  
      name = user1  
      email = user1@email.com  

"includeIf"조건자는 두통을 줄여줍니다!
Truong Nguyen

1

Caleb의 답변을 바탕 git으로이 디렉토리의 모든 리포지토리를 올바르게 영구적으로 구성 하는 수정 된 명령을 정의하여 향후 모든 바닐라 git 사용이 새로운 구성을 사용하도록 할 수 있습니다. 내가 사용하는 hub다른 자식 래퍼 인, 내 교체 그래서 alias git=hub이 함께하고 호출 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 구성을 올바르게 읽는 다른 자식 프론트 엔드에도 영향을 미칩니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.