Découvrez la branche d'un commit appartient dans LibGit2Sharp?
-
13-11-2019 - |
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:
C'est ce que je suis à la recherche de:
TortoiseGit du comportement de montrer les plus pertinents nom de la branche:
Dépôt d'exemple: https://docs.google.com/open?id=0B-3-X85VysdNcmZIaGVTSDZSenVGbTJxYlI2SUlsZw
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));
…
}