Wie finde ich alle Commits mit einem bestimmten übergeordneten Element?

Lesezeit: 3 Minuten

Wie kann ich alle Commits in einem Repository finden, die ein bestimmtes übergeordnetes Element haben?

Zum Beispiel, wenn ich ein Commit habe A, ich möchte alle anderen Commits finden, die den Elternteil mit teilen A. Was wäre der effektivste, dh performanteste und dennoch korrekte Weg, dies in LibGit2Sharp zu tun?

Das ist eine schwierige Frage 😉

Das Git-Objekt ermöglicht es, die Eltern eines Commits abzurufen. Es gibt jedoch keine einfache Möglichkeit, die untergeordneten Elemente eines Commits zu finden.

Der folgende Code würde jedoch teilweise löse das. Die Idee ist, a git log aus allen Referenzen des Repositorys (Heads, Tags, …) und wählen Sie nebenbei jeden Commit aus, der ein Parent mit dem angeforderten SHA trägt.

Da der Durchlauf von den neuesten Commits den Ancestor-Pfad entlang erfolgt, kann es einige Zeit dauern, wenn Sie in einem Repository mit einer sehr großen Historie und vielen Branches nach den Kindern eines sehr frühen Commits suchen.

[Fact]
public void CanRetrieveChildrenOfASpecificCommit()
{
    TemporaryCloneOfTestRepo path = BuildTemporaryCloneOfTestRepo(StandardTestRepoPath);
    using (var repo = new Repository(path.RepositoryPath))
    {
        const string parentSha = "5b5b025afb0b4c913b4c338a42934a3863bf3644";

        var filter = new Filter
                         {
                             /* Revwalk from all the refs (git log --all) ... */
                             Since = repo.Refs, 

                             /* ... and stop when the parent is reached */
                             Until = parentSha
                         };

        var commits = repo.Commits.QueryBy(filter);

        var children = from c in commits
                    from p in c.Parents
                    let pId = p.Id
                    where pId.Sha == parentSha
                    select c;

        var expectedChildren = new[] { "c47800c7266a2be04c571c04d5a6614691ea99bd", 
                                        "4a202b346bb0fb0db7eff3cffeb3c70babbd2045" };

        Assert.Equal(expectedChildren, children.Select(c => c.Id.Sha));
    }
}

Grenzen:

  • Dadurch werden keine Commits abgerufen, die umgeschrieben wurden (z. B. durch Amend oder Rebase), da LibGit2Sharp (noch) keine Möglichkeit bietet, auf das Reflog zuzugreifen.
  • Unerreichbare (dangling) Commits werden mit diesem Vorschlag ebenfalls nicht abgerufen.

Test-Repository:

Der Inhalt des abgefragten Repositorys wird unten angezeigt

$ git log --all --graph
* commit 4c062a6361ae6959e06292c1fa5e2822d9c96345
| Author: gor <[email protected]>
| Date:   Thu Apr 14 18:44:16 2011 +0300
|
|     directory was added
|
*   commit be3563ae3f795b2b4353bcce3a527ad0a4f7f644
|  Merge: 9fd738e c47800c
| | Author: Scott Chacon <[email protected]>
| | Date:   Tue May 25 11:58:27 2010 -0700
| |
| |     Merge branch 'br2'
| |
| | * commit e90810b8df3e80c413d903f631643c716887138d
| | | Author: Vicent Marti <[email protected]>
| | | Date:   Thu Aug 5 18:42:20 2010 +0200
| | |
| | |     Test commit 2
| | |
| | * commit 6dcf9bf7541ee10456529833502442f385010c3d
| |   Author: Vicent Marti <[email protected]>
| |   Date:   Thu Aug 5 18:41:33 2010 +0200
| |
| |       Test commit 1
| |
| | *   commit a4a7dce85cf63874e984719f4fdd239f5145052f
| | |  Merge: c47800c 9fd738e
| |/ /  Author: Scott Chacon <[email protected]>
| | /   Date:   Tue May 25 12:00:23 2010 -0700
| "https://stackoverflow.com/"/|         Merge branch 'master' into br2
| |
* | commit 9fd738e8f7967c078dceed8190330fc8648ee56a
| | Author: Scott Chacon <[email protected]>
| | Date:   Mon May 24 10:19:19 2010 -0700
| |
| |     a fourth commit
| |
* | commit 4a202b346bb0fb0db7eff3cffeb3c70babbd2045
| | Author: Scott Chacon <[email protected]>
| | Date:   Mon May 24 10:19:04 2010 -0700
| |
| |     a third commit
| |
| * commit c47800c7266a2be04c571c04d5a6614691ea99bd
|/  Author: Scott Chacon <[email protected]>
|   Date:   Tue May 25 11:58:14 2010 -0700
|
|       branch commit one
|
* commit 5b5b025afb0b4c913b4c338a42934a3863bf3644
| Author: Scott Chacon <[email protected]>
| Date:   Tue May 11 13:38:42 2010 -0700
|
|     another commit
|
* commit 8496071c1b46c854b31185ea97743be6a8774479
  Author: Scott Chacon <[email protected]>
  Date:   Sat May 8 16:13:06 2010 -0700

      testing

* commit 41bc8c69075bbdb46c5c6f0566cc8cc5b46e8bd9
| Author: Scott Chacon <[email protected]>
| Date:   Tue May 11 13:40:41 2010 -0700
|
|     packed commit two
|
* commit 5001298e0c09ad9c34e4249bc5801c75e9754fa5
  Author: Scott Chacon <[email protected]>
  Date:   Tue May 11 13:40:23 2010 -0700

      packed commit one

.

308700cookie-checkWie finde ich alle Commits mit einem bestimmten übergeordneten Element?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy