자식 저장소에서 / etc /를 추적하고 루트로 커밋 할 때 올바른 사용자 이름


13

우리는 git을 사용하여 /etc/서버의 변경 사항을 추적 합니다.

관리자는 / etc /에서 파일을 변경할 때 루트로 작동하므로 커밋에 작성자가 있습니다.

root <root@machinename>

실제로 어떤 관리자가 변경을 수행했는지 알 수 없으므로 이는 매우 만족스럽지 않습니다.

git log에서 실제 관리자 이름을 얻으려면 어떻게해야합니까? 우리는 종종 무언가가 작동 할 때까지 대화식으로 변경하기 때문에 저장소의 로컬 복제본을 유지하는 것이 가능하다고 생각하지 않으며 change-commit-push-seeError-repeat cycle은 여기서 도움이되지 않습니다.


실제 루트로, 또는 루트로 sudo'd?
Decado

현재 실제 루트 (ssh root @ 또는 "su", sudo 없음)
cweiske

을 사용 etckeeper하면 버전 관리 / etc에서 이와 같은 이상한 문제를 처리합니다. 또한 사용자 별 계정을 사용하십시오 sudo.
Caleb

답변:


12

망할 놈의 저자 및 커미터 이름은 환경 변수에 영향을받을 수있다 GIT_COMMITTER_NAME, GIT_COMMITTER_EMAIL, GIT_AUTHOR_NAMEGIT_AUTHOR_EMAIL.

이제 트릭은 SSH를 통해 연결할 때 해당 변수를 원격 서버에 제출하는 것입니다.

  1. ~/.bashrc파일 에서 변수를 정의하고 내보내십시오 .

    export GIT_AUTHOR_NAME="Christian Weiske"
    
  2. 다음을 조정하여 SSH 연결로 자동 전송하십시오 ~/.ssh/config.

    SendEnv LANG LC_* GIT_*
    

    LANGLC_*, 너무 neccesary하지 않은,하지만 난에 제출해야한다고 생각, 그래서 데비안은 기본 ssh_config를에 다음이

  3. 원격 서버에서 sshd 구성을 조정하여 환경 변수 /etc/ssh/sshd_config를 승인 GIT_*하십시오.

    AcceptEnv LANG LC_* GIT_*
    

Voila- git commit루트 /etc/는 다음과 같습니다.

commit 8a4654f13241f05361283a88ce041a0fc24b8ac6
Author: Christian Weiske <christian.weiske@netresearch.de>

향후 서버 오류가 발생하는 경우 : http://cweiske.de/tagebuch/carry-git-settings.htm


5

먼저, 귀하의 질문과 관련이 없으므로 긴급하게root 로그인 사용을 중지하고 su사용자 로그인을 sudo대신 사용하는 것이 좋습니다. root로그인을 콘솔로만 제한하십시오 .

즉, 거기에 도움이 될 수 git commit있는 --author옵션이 있습니다.

# git commit --author='Author Name <author@email.address.com>' -a

사용자 당 환경 변수를 신중하게 사용하여 설정 GIT_AUTHOR_NAME하고 GIT_AUTHOR_EMAIL변수 를 지정할 수도 있습니다 . 로그에는 다른 작성자와 동일한 커미터 ( root@host)가 표시되지만 더 많은 감사를 제공합니다. 물론 변수를 그대로 유지하려면 관리자를 신뢰해야합니다. 각각이 특정 쉘을 사용함에 따라, sudo특정 git변수 로 파일을 루팅하고 소싱 하여 커밋에서 각 파일을 다르게 식별 할 수 있습니다. 실용적이지는 않지만 스크립트를 사용하여 자동화 할 수도 있습니다.

편집 : 물론 @ScottPack에 의해 임명 된 더 나은 접근 방식은 Puppet 또는 Chef와 같은 구성 관리 시스템을 사용하고 실제 서버가 아닌 중앙 서버의 변경 사항을 추적하기 위해 git을 사용하는 것입니다. 각 관리자가 작업 사본을 가질 수 있습니다 구성의.


--author물론 가능하지만 사람들은 쓰기가 너무 많아 일반 워크 플로에서 사용하지 않습니다. sudo를 사용하는 두 번째 아이디어 : 나는 sudo를 유해하다고 생각하고 ssh 키로 만 ssh root 액세스를 사용하는 사람들 중 하나입니다. 그렇습니다. 우리는 관리자를 신뢰합니다.
cweiske

5
@cweiske 왜 sudo가 유해하다고 생각합니까?
coredump

1
@cweiske 당신은 중요한 정보 (그들이 누구인지, 무엇이 바뀌 었는지, 왜 변경되었는지, 티켓 번호가 있는지)를 위해 커미터를 조사하는 래퍼 스크립트를 고려 했습니까? 마지막으로 고용 한 곳에는 DNS 변경을위한 유사한 시스템 (CVS 기반)이 있었고 정책을 적용하기위한 래퍼를 사용하여 놀랍도록 잘 작동했습니다.
voretaq7

4
@cweiske 나는 당신의 평가에 조금 동의하지 않습니다. 와 동안은 SSH 키 암호를 캐시하고 아무 생각없이 루트 기계에 로그인하거나 간단한 암호 또는 루트 암호에 비해 사용자의 컴퓨터에 동일한 암호를 사용하는 SSH 에이전트를 사용할 수 있습니다 sudo당신이 강제로 암호를 입력하도록 사용자에게도 ( ssh 키를 사용하여 사용자로 로그인하는 경우) 사용자가 실행할 수있는 것을 제어 할 수 있으며 주로 누가 무엇을했는지에 대한 감사 추적이 있습니다. 그러나 모든 사람은 자신의 의견을 가질 권리가 있습니다.
coredump

2
또한 sudo사용자가 각각의 모든 명령에 대해 암호를 입력 하도록 구성 할 수도 있습니다 ( timestamp_timeout = 0). 아마도 개발 및 준비 상자에는 적합하지 않지만 생산에는 적합합니다. IMHO는 SF 컨센서스를 바탕으로에 대한 의견을 재고해야합니다 sudo. SF의 가장 큰 장점 중 하나는 자신의 sh * t :-)를 아는 동료 커뮤니티가 있다는 것입니다.
벨민 페르난데스

3

퍼티 를 사용하면 "연결-> 데이터-> 환경 변수"에서이를 설정할 수 있습니다.

또한 su루트에 ' ' 뒤에 있습니다.


3

ssh 키를 사용하여 서버에서 사용자 계정을 프로비저닝하는 경우 설정시 인증 된 키에 환경 변수를 실제로 연결할 수 있습니다 (예 : ~ bob / .ssh / authorized_keys

environment="GIT_AUTHOR_NAME=Bob Smith",environment="GIT_AUTHOR_EMAIL=bob.smith@megacorp.com" ssh-rsa AAAA.... bob.smith@megacorp.com

이 방법으로 SSH를 사용하는 사용자는 자동으로 이러한 환경 설정을 갖습니다. 로컬 클라이언트에서 전달할 필요가 없습니다. 이 정보가 이미 있고 구성 관리 시스템에서 authorized_keys 구성을 생성하는 경우 보너스 포인트.

참고 : 위의 PermitUserEnvironment yessshd_config에 필요합니다


1

사용 sudo중이고 루트가 아닌 사용자가 홈 디렉토리를 마운트 한 경우 :

git -c include.path=<file>에 구성이 포함됩니다 <file>.

루트가 아닌 사용자의 구성 파일을 자동으로 가져 오기 위해 bash별명을 사용합니다 .

alias gsudo='sudo git -c "include.path='"${XDG_CONFIG_DIR:-$HOME/.config}/git/config\" -c \"include.path=$HOME/.gitconfig\""

그런 다음 둘 다 gsudo대신 사용 git합니다.

  • 루트로 실행
  • 모든 비 루트 사용자 git 구성에 액세스

구성을 실제로 가져 왔는지 확인하십시오.

gsudo config --list --show-origin --includes | less

0

coredump의 답변 외에도 .git/config리포지토리 작업 복사본의 파일에서 직접 또는 git config명령을 사용하여 이러한 옵션을 설정할 수도 있습니다 .

man git-config명령에 대한 자세한 내용 과 명령으로 할 수있는 멋진 작업을 참조하십시오.


한 관리자가 해당 컴퓨터에서 해당 리포지토리에 커밋하는 경우에만 작동하지만 여러 관리자가 실패합니다.
cweiske

사실-중앙 저장소가 있고 사람들이 해당 저장소에 복제 및 풀 / 푸시하는 상황에 더 적합합니다.
voretaq7
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.