1

コミットのメモが見つからない別のブランチに到達するまで、すべてのブランチを見つけたい開始コミットがあります。

commit 1
|
commit 2
|         commit5
commit3  /
|       / 
commit 4
|
commit 6

この場合、コミット 1 ~ 5 のすべてのコミットに「find branch」というメモがあり、コミット 6 にはその値の not がないと言います。

したがって、コミット 1 から始めて、すべての親を検索し (つまり、コミット 2)、このコミットのブランチがあるかどうかを確認しようとします (つまり、子の数が 1 より大きい)。子が複数いる場合

  1. getChildren()メソッドは PlotCommit オブジェクトに対してのみ存在しますが、メソッドはObjectparentCommit.getParents()のみを返しますRevCommit
  2. 特定のコミットに存在するブランチ名を見つけたい

その後、コミットに関するメモがなくなると (つまり、コミット 6 にメモがない場合)、ロジックはそこで停止し、ブランチ名のコレクションが返されます。

    Repository repo;//will be set as part of some other logic
    private Set findBranchesForCommit(PlotCommit parentCommit, String note) throws ExecutionException, MissingObjectException, IncorrectObjectTypeException, IOException {
        Set branches = new HashSet();
        PlotCommit[] parents = (PlotCommit[]) parentCommit.getParents();//XXX will throw exception as this return RevCommit[]
        for (int i = 0; i < parents .length; i++) {
            PlotCommit commit = parents[i];
            String result = extractExistingMessage(repo, "refs/notes", commit);//will return the if the note available for particular commit
            if (result.trim().length() > 0 && result.equalsIgnoreCase(note)) {
                System.out.println("#########"+commit.getChildCount());
                //TODO need to add logic to find the branch of the particular commit
                branches.add(""); //add the branches available for the commit
                branches.addAll(findBranchesForCommit(commit, note));
            }
        }
        return branches;
    }

期待される結果

特定の git ノートを含むコミットのブランチ名を見つけたいです。上記の例では、コミット 1 とコミット 5 のブランチ名が返されます

4

1 に答える 1

1

この種のリクエスト (特定のコミットのブランチを見つける) の git コマンドは次のとおりです。

git branch --contains <commit>

(「Git: コミットがどのブランチから来たかを見つける」、および「特定のコミットを含むブランチを一覧表示する方法」のように)

JGitのように実装されていません。

このスレッドには、次の提案があります。

' git branch --contains <commit>' は、このコミットを含むすべてのブランチを報告します。
リモートから取得したすべてのコミットの標準的なプッシュ/フェッチ ワークフローでは、" origin/master" のみが報告されます。
ローカル コミットの場合でも、featureブランチを にマージしたと想像してくださいmaster。次に、このコマンドは、マージ後に作成されたmasterブランチとすべてのブランチも報告します。 Git は、それが作成されたブランチのリビジョンを保存しません。feature

これらの警告の後: 「git branch --contains」の大まかな実装は次のようになります。

Repository repo = new FileRepository(args[0]);
RevWalk walk = new RevWalk(repo);
RevCommit commit = walk.parseCommit(repo.resolve(args[1] + "^0"));
for (Map.Entry<String, Ref> e : repo.getAllRefs().entrySet())
  if (e.getKey().startsWith(Constants.R_HEADS))
    if (walk.isMergedInto(commit,
        walk.parseCommit(e.getValue().getObjectId())))
      System.out.println("Ref " + e.getValue().getName()
                                + " contains commit " + commit);
于 2013-01-02T08:58:55.307 に答える