gitolite 서버가gitpush의 제출 작성자 정보를 심사합니다

1. 환경


Gitolite 버전: v3.5.1

2. 나를 괴롭히는 질문


Git는 분산 버전 제어 시스템으로 제출자의 사용자 이름과 메일 주소를 마음대로 설정할 수 있다.팀워크를 할 때 이것은 너무 안전하지 않다.팀 구성원이 다른 사람을 사칭하여 서버 버전 라이브러리에 새 제출을 전송하면 찾을 수 없습니다.
git config user.name git config user.email
현재 Git 서버를 구축하는데 자주 사용하는 것은 Gitolite, Gitosis, Gerrit이다.이 중 Google에서 개발한 Gerrit 감사 서버는 제출자의 메일 주소를 검토했습니다(그러나 user.name에 대한 검토는 없습니다).Gitolit와 Gitosis는 전혀 심사하지 않았다.
저는 최근에 Gitolite + SSH를 Git 서버로 구축하고 Redmine를 수요 관리와 결함 추적에 협조하여 Git와의 통합을 실현했습니다.Redmine의 사용자는 하나의 ID로 식별되며 Git의 제출 작성자는 사용자 이름과 메일 주소를 포함하여 Redmine의 사용자 ID와 Git의 제출 작성자를 연결할 수 있습니다.
분명히 Git를 제출할 때 제출자의 이름과 메일 주소를 마음대로 변경하면 Remine 소프트웨어에 설정된 사용자 대응 관계를 파괴할 수 있다.
 

3. 제출자 정보를 Gitolite 서버에서 검토


우선, Gitolite 자체는 이런 기능을 가지고 있지 않다. 그러면 어떻게 Gitolite 서버가 제출자 정보를 심사할 수 있을까?바로 내 머리를 스쳐 지나간 생각은git의hooks였다. Gitolite 공식 문서에서 답을 찾았다.
 
gitolite documentation 홈페이지:http://gitolite.com/gitolite/master-toc.html
 
pre-receive 갈고리를 사용하면 pre-receive 파일의 내용은 다음과 같습니다.
#!/bin/sh
#
mismatch=0
while read old new ref; do
  author=`git show --pretty=format:%an $new | head -1`
  email=`git show --pretty=format:%ae $new | head -1`
  
#  echo "     email = \"$email\", author = \"$author\", GL_USER = \"$GL_USER\""
  
  if test "$GL_USER" != "$author"; then
    echo
    echo "ERROR: Invalid user name on object $new:"
    echo "       Expecting \"$GL_USER\", got \"$author\""
    mismatch=1
  fi
  
  if test "[email protected]" != "$email"; then
    echo
    echo "ERROR: Invalid user email on object $new:"
    echo "       Expecting \"[email protected]\", got \"$email\""
    mismatch=1
  fi
done

if test $mismatch -eq 1; then
  echo
  echo "Please run the following commands and try again:"
  echo "> git config user.name \"$GL_USER\""
  echo "> git config user.email \"[email protected]\""
  echo "> git commit --amend --author=\"$GL_USER <[email protected]>\""
  echo
  exit 1;
fi

exit 0;

조금만 더 설명하면 어떻게 실현하는지 알 수 있을 것이다.
◆git쇼로commit의 제출자(author)와 메일 주소(email)를 해석한다.
◆ Gitolite 자체 환경 변수로 $GL_USER,git push에 사용할 SSH 사용자 정보를 얻습니다.이거 $GL_USER는 Gitolit 서버에 설치 디렉토리입니다.\.gitolite\keydir 아래의 SHH 공개 키 파일 이름(SSH 연결 사용자에 대응하며 일반적으로 팀 구성원의 이름으로 명명됨).
 

4. pre-receive 갈고리는 어디에 놓을까요?


두 가지 옵션이 있습니다.
◆ 버전 라이브러리를 심사하려면 Gitolite 서버에서 지정한 버전 라이브러리의 훅스 디렉터리에 pre-receive 파일을 넣으면 된다.
◆ Gitolite 서버의 모든 버전 라이브러리를 검토합니다.다음 절차를 따를 수 있습니다.
①, gitolite를 설치한 사용자 신분(예를 들어git)으로gitolite 서버에 로그인한다.(SSH로 로그인 가능);
②, pre-receive를gitlolite 설치 디렉터리에/home/git/로 복사합니다.gitolite/hooks/common/
③, 실행./bin/gitolite setup --hooks-only
한 번은 설치가 끝났습니다.gitpush에서 "error: cannot run hooks/pre-receive: No such file or directory"라고 계속 알렸습니다. 마지막에 발견했을 때pre-receive 파일의 줄 바꿈 문자가 윈도우즈의\r에서 만든 귀신이기 때문에 바꾸면 됩니다.
gitolite의 hooks를 설치하는 방법도 홈페이지를 참고할 수 있습니다.http://gitolite.com/gitolite/cust.html#hooks

좋은 웹페이지 즐겨찾기