Libgit2Sharp: получить файлы во всех коммитах между двумя тегами

Я могу сделать это в GitBash: $ git diff --name-only v01...HEAD -- *.sql

который дает:

Components/1/Database/Stored Procedures/spDC1.sql Components/1/Database/Stored Procedures/spDC2.sql

Я не понимаю, как бы я сделал это в LibGit2Sharp. Любые идеи? Спасибо


person Badgerspot    schedule 06.04.2016    source источник


Ответы (2)


Вот пример из одного из моих проектов, который получает коллекцию ICommitLog между двумя фиксациями (текущая HEAD против основной ветки):

    // git log HEAD..master --reverse
    public ICommitLog StalkerList {
        get {
            var filter = new CommitFilter { 
                SortBy = CommitSortStrategies.Reverse | CommitSortStrategies.Time,
                Since = master,
                Until = head.Tip,             
            };
            return repo.Commits.QueryBy (filter);
        }
    }

Когда у вас есть ICommitLog коллекция всех коммитов в нужном вам диапазоне, вы можете просмотреть каждый коммит, чтобы получить список файлов, которые были затронуты в этом коммите (конечно, вам нужно будет добавить фильтрацию имени файла через ваш Требования "*.sql":

    public String[] FilesToMerge (Commit commit)
    {
        var fileList = new List<String> ();
        foreach (var parent in commit.Parents) {
            foreach (TreeEntryChanges change in repo.Diff.Compare<TreeChanges>(parent.Tree, commit.Tree)) {
                fileList.Add (change.Path);
            }
        }
        return fileList.ToArray ();
    }
person SushiHangover    schedule 07.04.2016

Я думаю, что ответ SushiHangover на это довольно правильный. Всего пара поправок/обновлений. (P.S. Да, я знаю, что этот вопрос относительно старый, но полный ответ помог бы мне, если бы я нашел его сегодня, поэтому поместите его здесь для будущих заглядываний).

Этот фрагмент должен быть комментарием к поправке, но я пока не могу комментировать (мало репутации):

Во-первых, я думаю, что в примере с Sushi master и head.Tip — это неправильные вещи. Пока исключает фиксацию из результатов и исключает ее предков. Поэтому, если вы поместите туда head.Tip, это практически исключит все дерево истории.

Итак, AFAIK, это должно читаться примерно так:

 // git log HEAD..master --reverse
public ICommitLog StalkerList {
    get {
        var filter = new CommitFilter { 
            SortBy = CommitSortStrategies.Reverse | CommitSortStrategies.Time,
            Since = head.Tip,
            Until = master       
        };
        return repo.Commits.QueryBy (filter);
    }
}

Также СУПЕР важно понимать, что порядок, который вы им отдаете, имеет значение. Если вы просто поменяете их местами, вы ничего не получите взамен.

(Также обратите внимание, что в исходном примере Sushi после «head.Tip» был неправильный «,».

Это обновление:

Также стоит отметить, что недавно была обновлена ​​библиотека libgit2sharp. Замена «с» и «до» на «IncludeReachableFrom» и «ExcludeReachableFrom» соответственно.

Имена не особенно полезны, пока вы не поймете, что они просто более подробно рассказывают о том, что они делают.

Комментарий к Exclude, например, гласит:

    /// A pointer to a commit object or a list of pointers which will be excluded (along with ancestors) from the enumeration.

Таким образом, последняя реализация будет выглядеть примерно так:

using (Repository r = new Repository(@"[repo_location]"))
{
    CommitFilter cf = new CommitFilter
    {
        SortBy = CommitSortStrategies.Reverse | CommitSortStrategies.Time,
        ExcludeReachableFrom = r.Branches["master"].Tip,
        IncludeReachableFrom = r.Head.Tip
    };

    var results = r.Commits.QueryBy(cf);

    foreach (var result in results)
    {
        //Process commits here.
    }
}

Протестировал это в LINQPad, и, похоже, это работает. Хотя, возможно, что-то упустил, так как это был быстрый набросок. Если это так, дайте мне знать.

Что следует отметить: master и Head на самом деле являются свойствами репозитория, я не мог видеть, что это происходит откуда-либо в старом примере, но это может быть просто разница в версии со старой версией.

person Nick Stafford    schedule 20.10.2017
comment
Спасибо за объяснение ExcludeReachableFrom и IncludeReachableFrom - на самом деле я перевернул свой и не понимал, почему их переключение сработает - пока не прочитал ваш пост. Отличный пост! - person Colin; 06.12.2017
comment
@Colin спасибо за отзыв, это редактирование пунктуации тоже было высоко оценено. - person Nick Stafford; 27.03.2018