2016-10-17 3 views
1

JGit에서 git branch -a --contains <commit id> --merged을 어떻게 복제 할 수 있습니까?JGit은 "git branch -a --contains <commit id> --merged"와 같습니다.

이하, --merged없이 복제하지만 변경 사항이 병합 된보고 분기에만 필터를 추가하는 방법과 병합 지점 이후에 생성 된 모든 분기를 포함하지 않는 방법을 잘 모르겠습니다.

명령 줄에서 수행 할 수있는 경우 JGit도 실행될 수 있다고 예상되지만 방법은 잘 모르겠습니다.

참고 : 아래 코드는 JGit 주위의 래퍼 인 GitController를 사용하므로 일부 방법은 순수한 JGit이 아닙니다.

코드

public List<String> getBranchesContainingCommit(File localWorkingCopy, String id, boolean onlymerged = true) { 
    List<String> branches = new ArrayList<>() 

    // Access Repository 
    Git git = openExistingRepository(localWorkingCopy) 

    // Find commit 
    RevWalk walk = new RevWalk(git.repository) 
    ObjectId foundId = git.repository.resolve(id + "^0") 
    RevCommit commit = walk.parseCommit(foundId) 

    // For all Remote Branches 
    getBranches(git,true).each{ Ref ref -> 

    if (walk.isMergedInto(
      walk.parseCommit(ref.getObjectId()), commit)) { 
     branches.add(branchNameFromRefName(ref.name)) 
    } 
    } 
    walk.close() 
    walk.dispose() 
    return branches 
} 

테스트 오류

java.lang.AssertionError: Wrong number of branches found 
Expected: [feature/branchContainsMerged, feature/branchContainsBase] 
Actual: [feature/branchContainsAfterMerge, feature/branchContainsBase, feature/branchContainsMerged, master] 
Expected :2 
Actual :4 
    <Click to see difference> 

테스트 케이스

/** 
    * 1. Create baseBranch 
    * 2. branch branchMergedChangeSrc 
    * 3. Make change 
    * 4. merge branchMergedChangeSrc to baseBranch 
    * 5. branch branchUnmergedChangeSrc 
    * 6. Make change 
    * 7. Branch branchAfterMerge from baseBranch 
    * 
    * Expect: with merges filter 
    * idMerged on branchMergedChangeSrc, baseBranch 
    * idUnmerged on branchUnmergedChangeSrc 
    */ 
    String baseBranch="feature/branchContainsBase" 
    String branchMergedChangeSrc="feature/branchContainsMerged" 
    String idMerged = "f342575605aa297778047a940ac1f47b74c29d81" 
    String branchUnmergedChangeSrc="feature/branchContainsUnMerged" 
    String idUnmerged = "e1dbd1e371d60af235a1a0e82f95c25a9c0049b6" 
    String branchAfterMerge="feature/branchContainsAfterMerge" 

    @Before 
    void setup() { 
    controller = (GitController) getSCM(SCMType.Git) 
    workspace = createEmptyTestDir() 

    // Clone Skeleton 
    controller.cloneRepository(new File("testdata/skeleton.git").toURI().toString(), workspace) 
    } 

    @Test 
    void mergedBranchesForMergedCommitTest() { 
    List<String> containingBranches = controller.getBranchesContainingCommit(workspace, idMerged) 

    // Unmerged Change on Branch 
    checkBranches([branchMergedChangeSrc, baseBranch], containingBranches) 
    } 


    @Test 
    void unmergedBranchesForMergedCommitTest() { 
    List<String> containingBranches = controller.getBranchesContainingCommit(workspace, idUnmerged) 

    // Unmerged Change on Branch 
    checkBranches([branchUnmergedChangeSrc], containingBranches) 
    } 


    void checkBranches(List<String> expectedBranchNames, List<String> actual) { 
    assertEquals("""Wrong number of branches found 
Expected: ${expectedBranchNames} 
Actual: ${actual}""", expectedBranchNames.size(), actual.size()) 

    expectedBranchNames.each { String branch -> 
     assertTrue("Expected ${branch} in containing: ${actual}", actual.contains(branch)) 
    } 

    } 

답변

0

결함 듣고는 t 생각에 모자를 사용하면 직접 병합이 발생한 지점으로 포함을 제한 할 수 있습니다. 모든 git은 어떤 브랜치가 자신의 히스토리의 버츄얼에 의해 커밋을 포함하고 어떤 커밋을 가지지 않는지를 알 수있다.

이것은 커밋에서 분기의 HEAD로 걷는 것으로 수행됩니다. 지점 헤드는 지속적으로 앞으로 이동하고 "- 병합"을 사용하는 것은 한 지점에서 ID 커밋 ID == 분기 HEAD 만 때문에 작동합니다.

그러므로 --merged을 복제하려고하면 예상 결과가 나오지 않으므로 나쁜 생각입니다.