2014-09-24 7 views
2

고객 맞춤 앱이 포함 된 gitolite 서버가 있습니다기본 리포지토리 서브 모듈 해시

모든 앱에는 기본 앱을 나타내는 하위 모듈 "repository/core"가 있습니다.

우리 고객의 모든 앱과 수정 버전이있는 대시 보드를 만들고 싶습니다.

gitolite는 디스크의 모든 저장소를 저장소에 저장하며 대시 보드 앱은 repos /에 직접 액세스하거나 ssh 키를 사용하면 더 쉽게 액세스 할 수 있습니다.

내 질문에 맨손 저장소에서 어떤 하위 모듈이 어떤 개정판인지 알고 싶습니다. 누가 이고 누가 그것을 커밋 했습니까?

답변

1

당신은 모듈로 간주되는 경로를 찾기 위해 .gitmodules을 표시 한 다음 다음 거라고하는 ref: refs/heads/master처럼, 그들을 통해 이동하고 <module>.git/HEAD/ 참조 아마 상징적 참조 (가리키는 것을 알 수 있습니다 체인을 연결하여 refs/heads/master 값을 찾습니다. 그런 다음 해당 모듈의 가장 최근의 커밋 해시를 제공합니다.

2

JGit은 모든 알려진 서브 모듈을 나열하는 SubmoduleStatusCommand을 가지고 있습니다. 이 명령 은 베어 리지 (non-bare) 리포지토리에서만 작동합니다. 당신이 볼 수 있듯이

Git git = Git.open(new File("/path/to/repo/.git")); 
Map<String,SubmoduleStatus> submodules = git.submoduleStatus().call(); 
SubmoduleStatus status = submodules.get("repository/core"); 
ObjectId headId = status.getHeadId(); 

는 명령은 SHA-1 HEAD의 커밋이 포함되어 각각의 SubmoduleStatus과 함께 서브 모듈-이름의 맵을 반환합니다.

얼마 전 더 자세한 내용이 담긴 article about JGit's submodule API도 있습니다. 당신과 같이 저장소의 객체 데이터베이스에서 직접 서브 모듈의 HEAD의 ID를 읽을 것이다 베어 저장소에

는 :

try(RevWalk revWalk = new RevWalk(repository)) { 
    RevCommit headCommit = revWalk.parseCommit(repository.resolve(Constants.HEAD)); 
} 
try(TreeWalk treeWalk = TreeWalk.forPath(repository, "repository/core", headCommit.getTree())) { 
    ObjectId blobId = treeWalk.getObjectId(0); 
    ObjectLoader objectLoader = repository.open(blobId, Constants.OBJ_BLOB); 
    try(InputStream inputStream = objectLoader.openStream()) { 
    // read contents from the input stream 
    } 
} 
+0

, 무엇 유형 "자식"에있다 당신의 본보기와 어디서 얻을 수 있습니까? –

+0

나는 NoWorkTreeException을 얻고있다 : 베어 리포 지 토리 (Bare Repository)는 베어 리포 지 토리 (unare repository)에서 실행 중이기 때문에 작업 트리도 인덱스도 없다. 해결 방법이 있습니까? –

+0

힘내는 명령을 만드는 데 사용할 수있는 팩토리 클래스입니다 (네이티브 힘의 도자기 명령과 유사). Git 인스턴스는 생성 된 저장소에 바인딩된다. Git 인스턴스를 만드는 한 방법은 Git.open (File)을 사용하는 것입니다. 지금 확장 답변을 참조하십시오. –

1

난 그냥 CI 서버에 대해이를 구현했다. 까다로운 부분은 벌거 벗은 체크 아웃으로 남아 있습니다.

1) git show HEAD:.gitmodules이 서브 모듈입니다 경로 목록을 가져올 수 있습니다 다음과 같이

내 솔루션이었다. 각 path =에 대한

2 가)이 세 번째 필드는 서브 모듈에있는 SHA를 확인하는 데 사용할 수 있습니다 : 나는 jGit에 새로운 해요

git ls-tree -z -d HEAD -- <submodule path>

+0

이것은 맨손 저장소와 함께 작동하는 유일한 대답입니다. 보너스 : 자식 이외에는 아무것도 필요하지 않습니다. –