22

私は別のlibgit2の問題を抱えており、あなたの助けに非常に感謝します。

ファイル履歴、つまりこのファイルが変更されたコミットのリストを取得しようとしています。そして、それはかなり型破りなようです...私が見る限り、そのための機能はありません。

私が思いつく唯一のアプローチは、リビジョンウォーキングAPIを使用してリビジョンを反復処理し、commitにアタッチされたツリーオブジェクトを確認し、そこで指定されたファイルを検索し、見つかった場合はリストにcommitを追加し、それ以外の場合は次のcommitに進みます。

しかし、それは私には最適ではないように見えます...

他のアプローチはありますか?たとえば、.gitフォルダーを直接調べて、そこで必要な情報を取得しますか?

よろしくお願いします!

4

3 に答える 3

15

しかし、それは私には最適ではないように見えます...

あなたのアプローチは正しいものです。あなたが戦わなければならないことに注意してください:

  • プレーンな名前変更(同じオブジェクトハッシュ、異なるツリーエントリ名)
  • 同じコミットで発生する名前の変更とコンテンツの更新(異なるハッシュ、異なるツリーエントリ名。libgit2では使用できないファイルコンテンツの分析と比較機能が必要になります)
  • 複数の親の履歴(マージされ、同じファイルが異なる方法で変更された2つのブランチ)

他のアプローチはありますか?たとえば、.gitフォルダーを直接調べて、そこで必要な情報を取得しますか?

.gitフォルダーのレイアウトを理解するのは常に時間のかかる作業ですが、この特定のファイル履歴の問題には役立たないのではないかと思います。

注:この質問は、このlibgit2sharpの問題に非常に近いものです。特定のファイルに影響を与えた最後のコミットを取得するにはどうすればよいですか?

アップデート

プルリクエスト#963はまさにこの機能を追加します。

LibGit2Sharp.0.22.0-pre20150415174523プレリリースのNuGetパッケージから利用できます。

于 2011-11-23T10:01:30.327 に答える
2

これは主にlibgit2のissues/495でフォローされています。libgit2sharpPR 963マイルストーン22
の場合)に実装され ていますが、libgit2自体ではまだ「取得可能」です。

この問題は、issues /3041に記載されています。をラップするログ機能を提供しますrevwalk
質問で言及されたアプローチは、このlibgit2sharpの例で使用されており、libgit2を使用してCに適合させることができます。3041の解決まで、現在の回避策のままです。

于 2015-06-17T07:20:44.690 に答える
0

C#を使用している場合、この機能はLibGit2Sharp0.22.0 NuGetパッケージプルリクエスト963)に追加されています。次のことができます。

var fileHistory = repository.Commits.QueryBy(filePathRelativeToRepository);
foreach (var version in fileHistory)
{
    // Get further details by inspecting version.Commit
}

私のDiffAllFiles VS Extension(コードを表示できるオープンソース)では、特定のコミットでファイルにどのような変更が加えられたかを確認できるように、ファイルの以前のコミットを取得する必要がありました。これは、ファイルの以前のコミットを取得する方法です。

/// <summary>
/// Gets the previous commit of the file.
/// </summary>
/// <param name="repository">The repository.</param>
/// <param name="filePathRelativeToRepository">The file path relative to repository.</param>
/// <param name="commitSha">The commit sha to start the search for the previous version from. If null, the latest commit of the file will be returned.</param>
/// <returns></returns>
private static Commit GetPreviousCommitOfFile(Repository repository, string filePathRelativeToRepository, string commitSha = null)
{
    bool versionMatchesGivenVersion = false;
    var fileHistory = repository.Commits.QueryBy(filePathRelativeToRepository);
    foreach (var version in fileHistory)
    {
        // If they want the latest commit or we have found the "previous" commit that they were after, return it.
        if (string.IsNullOrWhiteSpace(commitSha) || versionMatchesGivenVersion)
            return version.Commit;

        // If this commit version matches the version specified, we want to return the next commit in the list, as it will be the previous commit.
        if (version.Commit.Sha.Equals(commitSha))
            versionMatchesGivenVersion = true;
    }

    return null;
}
于 2016-07-09T16:25:46.160 に答える