====== Gitblit ======
* http://gitblit.com Java JGit 기반으로 만들어진 설치가 쉬운 Git 저장소 서버.
* 설치도 쉽고 사용법도 쉽지만 성능은 좀 떨어진다. 프로젝트가 대규모가 될 경우 성능저하가 심했다.
* [[http://gitblit.com/setup.html|Gitblit 설치/설정]]
* [[https://github.com/gitblit/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.properties''의 ''server.httpPort = 8080'' 지정 필요.
* 압축을 풀고 아래 명령으로 실행
java -server -Xmx1024M -Djava.awt.headless=true -jar gitblit.jar --baseFolder data
===== Hook =====
* Groovy 기반으로 후킹이 가능하다. [[http://gitblit.com/setup.html|Gitblit 설치/설정]] 참조.
==== protect-refs hook ====
* Git을 사용하다가 소스가 롤백 되는 현상이 있는데, 이는 보통 개발자가 Rebase, Reset 등을 하고 커밋을 역행했을 때 발생한다(NON-FAST-FORWARD).
* Github은 기본적으로 이 상태에 대해 경고를 내보낸다.
* Github 처럼 NON-FAST-FORWARD와 커밋 삭제를 방지하려면 ''protect-refs.groovy'' 훅을 ''preReceiveScripts'' 로 지정한다.
* 그 때, ''authorizedTeams''에 NON-FAST-FORWARD와 DELETE 작업을 해도 괜찮은 팀을 명시해주면 해당 팀원만 커밋을 할 수 있다.
===== 기본 API =====
* [[http://download.eclipse.org/jgit/docs/latest/apidocs/|JGit API Doc]]
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
==== 커밋/수정 커밋 메시지 및 파일 정보 확보 ====
[[https://groups.google.com/forum/?fromgroups#!searchin/gitblit/gitblit$20commit$20file$20list/gitblit/bTQU7IAjFBg/S0Mgy0HiJSYJ|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''으로 읽어오는것이 가능하다.
* 이 값은 ''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.properties''의 ''mail.mailingLists''에 지정한 Gitblit 전역 mailingLists 값
import com.gitblit.Keys
List globalMailingLists = gitblit.getStrings(Keys.mail.mailingLists)
==== 메일 발송 ====
* 기본적으로 ''gitblit.sendMail('제목', '내용', [toAddr,...])'' 로 메일을 보낼 수 있다.
* ''gitblit.properties''의 ''mail.*'' 프라퍼티에 이메일 서버 정보를 저장해 둘 수 있다.
* 메일 발송에 관한 자세한 코드는 Gitblit 배포본의 ''sendmail.groovy''를 참조한다.
==== 작업 대상 Reference 확인 ====
* ''commands'' 객체는 [[http://grepcode.com/file/repo1.maven.org/maven2/org.eclipse.jgit/org.eclipse.jgit/2.2.0.201212191850-r/org/eclipse/jgit/transport/ReceiveCommand.java|ReceiveCommand.java]] 클래스의 컬렉션이다.
* 이 ''ReceiveCommand''의 인스턴스에서 ''getRefName()'' 메소드의 결과는 ''refs/heads/[branch_name]]''형태이다.
* 이를 통해 작업 대상 브랜치를 알아낼 수 있다.