Question

Je suis en parcourant s'engage dans LibGit2Sharp:

Repository repo = new Repository("Z:/www/gg");

foreach (LibGit2Sharp.Commit commit in repo.Commits)
{
    ...
}

Je peux récupérer les propriétés comme Author et Message, mais je ne vois rien sur la branche il appartient?Idéalement, je voudrais avoir un pointeur sur l'objet de branche, mais même un nom, ce serait bien dans ce scénario.

C'est ce que le débogueur affiche:

enter image description here

C'est ce que je suis à la recherche de:

enter image description here

TortoiseGit du comportement de montrer les plus pertinents nom de la branche:

enter image description here

Dépôt d'exemple: https://docs.google.com/open?id=0B-3-X85VysdNcmZIaGVTSDZSenVGbTJxYlI2SUlsZw

Était-ce utile?

La solution

Il n'existe actuellement aucun moyen intégré pour imiter git branch --contains <commit>.

Toutefois, vous pouvez contourner cette limite explicitement la marche de chaque branche et de comparaison de chaque sauté commettre à l'encontre de la recherche d'un.

Test suivant illustre cette

[Test]
public void CanSearchBranchesContainingASpecificCommit()
{
    using (var repo = new Repository(StandardTestRepoPath))
    {
        const string commitSha = "5b5b025afb0b4c913b4c338a42934a3863bf3644";
        IEnumerable<Branch> branches = ListBranchesContaininingCommit(repo, commitSha);

        branches.Count().ShouldEqual(6);
    }
}

private IEnumerable<Branch> ListBranchesContaininingCommit(Repository repo, string commitSha)
{
    foreach (var branch in repo.Branches)
    {
        var commits = repo.Commits.QueryBy(new CommitFilter { Since = branch }).Where(c => c.Sha == commitSha);

        if (!commits.Any())
        {
            continue;
        }

        yield return branch;
    }
}

Note: Ce code a été testé avec succès contre le conseil actuel de la branche de développement de LibGit2Sharp.

Mise à JOUR:

À la suite de la discussion dans les commentaires, voici une petite mise à jour qui je l'espère pourra répondre à votre demande.

Le code ci-dessous sera de retour toutes les branches contenant la recherche s'engager.Si la validation se produit à l'extrémité d'au moins une des branches, les branches seront retournés à la place.

[Test]
public void CanSearchBranchesContainingASpecificCommit()
{
    using (var repo = new Repository(StandardTestRepoPath))
    {
        const string commitSha = "5b5b025afb0b4c913b4c338a42934a3863bf3644";
        IEnumerable<Branch> branches = ListBranchesContaininingCommit(repo, commitSha);

        branches.Count().ShouldEqual(6);

        const string otherCommitSha = "4a202b346bb0fb0db7eff3cffeb3c70babbd2045";
        branches = ListBranchesContaininingCommit(repo, otherCommitSha);

        branches.Count().ShouldEqual(1); // origin/packed-test
    }
}

private IEnumerable<Branch> ListBranchesContaininingCommit(Repository repo, string commitSha)
{
    bool directBranchHasBeenFound = false;
    foreach (var branch in repo.Branches)
    {
        if (branch.Tip.Sha != commitSha)
        {
            continue;
        }

        directBranchHasBeenFound = true;
        yield return branch;
    }

    if (directBranchHasBeenFound)
    {
        yield break;
    }

    foreach (var branch in repo.Branches)
    {
        var commits = repo.Commits.QueryBy(new CommitFilter { Since = branch }).Where(c => c.Sha == commitSha);

        if (!commits.Any())
        {
            continue;
        }

        yield return branch;
    }
}

Autres conseils

Git ne pas stocker l'information de la branche avec s'engage.Vous auriez à pied de l'histoire de DAG et de voir si la validation est accessible à partir de la réf.

Sur la ligne de commande avec la normale de git que vous exécutez git branch --contains $SHA1

Comme knittl dit, git ne pas stocker de l'information.Un commit est un état fixe de l'espace de stockage avec un certain nombre de métadonnées.Depuis un commit est immuable et les branches qu'il appartient peut changer, l'information de la branche ne peuvent pas être stockés directement dans le commettre.

Donc, pour savoir si un certain engager réellement appartient à une branche, vous avez besoin de marcher à travers les commits de la branche et de les comparer avec l'un commit.

Pour rendre cela plus rapidement, vous pouvez stocker tous les commits pour chaque branche dans un HashSet<T> comme ceci:

var branchCommits =
    repo.Branches.Select(
        b => new
             {
                 b.Name,
                 Commits = new HashSet<Commit>(b.Commits)
             })
        .ToArray();

foreach (Commit commit in branch.Commits)
{
    var commitBranches = branchCommits.Where(b => b.Commits.Contains(commit));

    …
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top