사용자 도구

사이트 도구


git:gitblit

Gitblit

설치시 주의점

  • Tomcat 6.0.10 이상 버전에서는 /,\가 이스케이프되어 URL이 제대로 인식 안되는 문제가 발생한다.
    • CATALINA_OPTS=-Dorg.apache.tomcat.util.buf.UDecoder.ALLOW_ENCODED_SLASH=true 설정을 하고 톰캣을 실행한다.
  • WebServer(nginx/apache) 연동시 대용량 데이터를 커밋하려면 요청 데이터 제한 용량을 풀어줘야한다.
    # nginx 설정
    client_max_body_size 1000M;
  • Git 저장소의 크기가 증가하면 저장소 웹페이지 들어가는 속도가 느려진다. 이때 저장소 설정에서 크기 계산 무시, 메트릭 요약 무시를 체크한다.

Gitblit GO

  • gitblit GO 버전은 HTTP가 꺼져있다. gitblit.propertiesserver.httpPort = 8080 지정 필요.
  • 압축을 풀고 아래 명령으로 실행
    java -server -Xmx1024M -Djava.awt.headless=true -jar gitblit.jar --baseFolder data

Hook

protect-refs hook

  • Git을 사용하다가 소스가 롤백 되는 현상이 있는데, 이는 보통 개발자가 Rebase, Reset 등을 하고 커밋을 역행했을 때 발생한다(NON-FAST-FORWARD).
  • Github은 기본적으로 이 상태에 대해 경고를 내보낸다.
  • Github 처럼 NON-FAST-FORWARD와 커밋 삭제를 방지하려면 protect-refs.groovy 훅을 preReceiveScripts 로 지정한다.
  • 그 때, authorizedTeams에 NON-FAST-FORWARD와 DELETE 작업을 해도 괜찮은 팀을 명시해주면 해당 팀원만 커밋을 할 수 있다.

기본 API

import com.gitblit.GitBlit
import com.gitblit.Keys
import com.gitblit.models.RepositoryModel
import com.gitblit.models.TeamModel
import com.gitblit.models.UserModel
import com.gitblit.utils.JGitUtils
import java.text.SimpleDateFormat
import org.eclipse.jgit.lib.Repository
import org.eclipse.jgit.lib.Config
import org.eclipse.jgit.revwalk.RevCommit
import org.eclipse.jgit.transport.ReceiveCommand
import org.eclipse.jgit.transport.ReceiveCommand.Result
import org.slf4j.Logger

커밋/수정 커밋 메시지 및 파일 정보 확보

Exporting files on post-receive hook. 대한 답변 참조

Repository r = gitblit.getRepository(repository.name)
 
for (ReceiveCommand command : commands) {
    def updateType = command.type
    def updatedRef = command.refName
 
    logger.info("## ${command.type} - ${command.refName}")
 
    def commits = JGitUtils.getRevLog(r, command.oldId.name, command.newId.name).reverse()
 
    switch (command.type) {
        case ReceiveCommand.Type.CREATE:
        case ReceiveCommand.Type.UPDATE:
        case ReceiveCommand.Type.UPDATE_NONFASTFORWARD:
            for (def commit in commits) {
                // commit : org.eclipse.jgit.revwalk.RevCommit
                logger.info("## commit.fullMessage : ${commit.fullMessage}") // 커밋 로그 메시지
 
                def files = JGitUtils.getFilesInCommit(r, commit)
 
                files.each { file ->
                    // 커밋/수정된 파일 정보 file : com.gitblit.models.PathModel
                    logger.info("## Commit File ${file.name} - ${file.path}")
                }
            }
    }
}

Commit Reject

boolean success = true
 
for (ReceiveCommand comment : commands) {
    if (...) {
        command.setResult(Result.REJECTED_OTHER_REASON, "${repository.name} 리포지토리에 커밋 실패");
        success = false
        break
    }
 
}
 
....
 
// 스크립트 마지막에서 결과리턴
return success

Repository Mailing List 정보 확보

  • 각 리포지토리의 설정에 보면 메일링 리스트 부분이 있다.
  • 여기에 이메일 주소를 공백으로 구분하여 넣으면, Groovy Script에서 List<String>으로 읽어오는것이 가능하다.
  • 이 값은 data/git/[Repository]/config 파일의 [gitblit] 섹션에 문자열로 저장된다.
  • 리포지토리에 설정된 mailingList
    Repository r = gitblit.getRepository(repository.name)
    Config config = r.getConfig()
    def mailinglist = config.getStringList('gitblit', null, 'mailingList') // 'gitblit'은 섹션명, null 은 서브 섹션, 'mailingList'는 설정 키
     
    logger.info("## mailing list ${mailinglist}")
  • data/gitblit.propertiesmail.mailingLists에 지정한 Gitblit 전역 mailingLists 값
    import com.gitblit.Keys
     
    List globalMailingLists = gitblit.getStrings(Keys.mail.mailingLists)

메일 발송

  • 기본적으로 gitblit.sendMail('제목', '내용', [toAddr,…]) 로 메일을 보낼 수 있다.
  • gitblit.propertiesmail.* 프라퍼티에 이메일 서버 정보를 저장해 둘 수 있다.
  • 메일 발송에 관한 자세한 코드는 Gitblit 배포본의 sendmail.groovy를 참조한다.

작업 대상 Reference 확인

  • commands 객체는 ReceiveCommand.java 클래스의 컬렉션이다.
  • ReceiveCommand의 인스턴스에서 getRefName() 메소드의 결과는 refs/heads/[branch_name]]형태이다.
  • 이를 통해 작업 대상 브랜치를 알아낼 수 있다.
git/gitblit.txt · 마지막으로 수정됨: 2015/03/26 10:58 저자 kwon37xi