如何按日期获得下一个git提交?

发布于 2025-02-07 19:37:37 字数 434 浏览 1 评论 0原文

在Windows计算机上的脚本(MSBuild)中,我有一个提交的SHA1。 在同一分支机构中获取“下一个”(按日期)提交sha1的正确git命令是什么?

从tortoisegit中查看此示例日志:

”示例log“

在我的脚本中,我当前有4B60A7E877762F421DDEEEEEEEEE4EA0282A99C5B20E4A。现在,我需要一个命令才能获得C0FB4C86C354CFE32C6D0F1753958B60DB7E086

In a script (msbuild) on a windows machine, I have the SHA1 of a commit.
What is the correct git command, to get the "next" (by date) commit SHA1 in the same branch?

Take a look at this example log from TortoiseGit:

Example log

In my script I currently have the 4b60a7e87762f421ddeee4ea0282a99c5db20e4a. Now I need a command to get c0fb4c86c354cfe32c6d0f1753958ab60db7e086.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

陌伤浅笑 2025-02-14 19:37:37

我最终编写了一个自定义的MSBUILD任务,该任务找到了前身。我将其发布,以防其他人派上用场。

根据Joanis的评论,我最终在GIT日志中查找下一个提交。因此,在我的msbuild-script中,我现在有一个目标,它可以找到下一个git commit并执行特定的目标targettoexecutefornextgitCommit,并将属性当前commithash设置为下一个git的哈希值犯罪。所以看起来像:

<Target Name="DoTargetForNextGitCommit">
    <!-- 6. Nachfolger vom aktuellen Commit finden -->
    <!-- 6.a Tag des aktuellen Commits finden. Damit die Anzahl der zu durchsuchenden Commits einschränken.
             Denn ich suche ja nur nach Commits, die danach kamen. -->
    <Exec Command="git log --format=%25%25cd --date=iso-strict -n 1 $(CurrentCommitHash)"
          WorkingDirectory="$(GitRepoDir)"
          ConsoleToMSBuild="true">
        <Output TaskParameter="ConsoleOutput" PropertyName="GitCommitTimestamp"/>
    </Exec>
    <Message Text="Commit-Zeitstempel: $(GitCommitTimestamp)"/>
    <!-- 6.b Git-Log holen, in eine ItemGroup packen, den Index des Elements finden, das meinen Hash hat
             und dann den Nachfolger holen und dessen hash finden -->
    <!-- 6.b.i Git-Log holen -->
    <Exec Command="git log --date-order --format=%25%25H --after=$(GitCommitTimestamp) origin/master"
          WorkingDirectory="$(GitRepoDir)"
          ConsoleToMSBuild="true">
        <Output TaskParameter="ConsoleOutput" PropertyName="GitCommitHashesAfterCommitDay"/>
    </Exec>
    <ItemGroup>
        <GitCommitHashesAfterCommitDayEntries Include="$(GitCommitHashesAfterCommitDay)"/>
    </ItemGroup>
    <!-- 6.b.ii Nachfolger holen-->
    <GetNextCommit Items="@(GitCommitHashesAfterCommitDayEntries)" CurrentCommitHash="$(CurrentCommitHash)">
        <Output TaskParameter="NextCommitHash" PropertyName="NextCommitHashProperty"/>
    </GetNextCommit>
    <Message Text="Nächster Commit: $(NextCommitHashProperty)" />
    <!-- 7. Wenn es einen Nachfolger gibt, dann beginne mit diesem wieder bei 1. -->
    <MSBuild Projects="$(MSBuildThisFile)"
             Targets="$(TargetToExecuteForNextGitCommit)"
             Properties="CurrentCommitHash=$(NextCommitHashProperty)"
             Condition=" '$(NextCommitHashProperty)' != '0' "/>
</Target>

<UsingTask TaskName="GetNextCommit" TaskFactory="CodeTaskFactory" AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.v12.0.dll">
    <ParameterGroup>
        <Items ParameterType="Microsoft.Build.Framework.ITaskItem[]" Required="true" />
        <CurrentCommitHash ParameterType="System.String" Required="true" />
        <NextCommitHash ParameterType="System.String" Output="true" Required="false" />
    </ParameterGroup>
    <Task>
        <Using Namespace="System.Linq"/>
        <Code Type="Fragment" Language="cs">
            <![CDATA[
                var hashes = Items.Select(i => i.ItemSpec).ToList();
                var currentCommitIndex = hashes.IndexOf(CurrentCommitHash);
                if (currentCommitIndex < 1)
                {
                    NextCommitHash = "0";
                }
                else
                {
                    var nextCommitIndex = currentCommitIndex - 1;
                    NextCommitHash = hashes[nextCommitIndex];
                }]]>
        </Code>
    </Task>
</UsingTask>

I ended up writing a Custom MSBuild-Task which finds the predecessor. I post it in case it might come in handy for someone else.

Based on the comments of joanis I ended up looking in the git log for the next commit. So in my msbuild-script I now have a target which finds the next git commit and executes a specific target TargetToExecuteForNextGitCommit and sets the property CurrentCommitHash to the hash value of the next git commit. So this looks like:

<Target Name="DoTargetForNextGitCommit">
    <!-- 6. Nachfolger vom aktuellen Commit finden -->
    <!-- 6.a Tag des aktuellen Commits finden. Damit die Anzahl der zu durchsuchenden Commits einschränken.
             Denn ich suche ja nur nach Commits, die danach kamen. -->
    <Exec Command="git log --format=%25%25cd --date=iso-strict -n 1 $(CurrentCommitHash)"
          WorkingDirectory="$(GitRepoDir)"
          ConsoleToMSBuild="true">
        <Output TaskParameter="ConsoleOutput" PropertyName="GitCommitTimestamp"/>
    </Exec>
    <Message Text="Commit-Zeitstempel: $(GitCommitTimestamp)"/>
    <!-- 6.b Git-Log holen, in eine ItemGroup packen, den Index des Elements finden, das meinen Hash hat
             und dann den Nachfolger holen und dessen hash finden -->
    <!-- 6.b.i Git-Log holen -->
    <Exec Command="git log --date-order --format=%25%25H --after=$(GitCommitTimestamp) origin/master"
          WorkingDirectory="$(GitRepoDir)"
          ConsoleToMSBuild="true">
        <Output TaskParameter="ConsoleOutput" PropertyName="GitCommitHashesAfterCommitDay"/>
    </Exec>
    <ItemGroup>
        <GitCommitHashesAfterCommitDayEntries Include="$(GitCommitHashesAfterCommitDay)"/>
    </ItemGroup>
    <!-- 6.b.ii Nachfolger holen-->
    <GetNextCommit Items="@(GitCommitHashesAfterCommitDayEntries)" CurrentCommitHash="$(CurrentCommitHash)">
        <Output TaskParameter="NextCommitHash" PropertyName="NextCommitHashProperty"/>
    </GetNextCommit>
    <Message Text="Nächster Commit: $(NextCommitHashProperty)" />
    <!-- 7. Wenn es einen Nachfolger gibt, dann beginne mit diesem wieder bei 1. -->
    <MSBuild Projects="$(MSBuildThisFile)"
             Targets="$(TargetToExecuteForNextGitCommit)"
             Properties="CurrentCommitHash=$(NextCommitHashProperty)"
             Condition=" '$(NextCommitHashProperty)' != '0' "/>
</Target>

<UsingTask TaskName="GetNextCommit" TaskFactory="CodeTaskFactory" AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.v12.0.dll">
    <ParameterGroup>
        <Items ParameterType="Microsoft.Build.Framework.ITaskItem[]" Required="true" />
        <CurrentCommitHash ParameterType="System.String" Required="true" />
        <NextCommitHash ParameterType="System.String" Output="true" Required="false" />
    </ParameterGroup>
    <Task>
        <Using Namespace="System.Linq"/>
        <Code Type="Fragment" Language="cs">
            <![CDATA[
                var hashes = Items.Select(i => i.ItemSpec).ToList();
                var currentCommitIndex = hashes.IndexOf(CurrentCommitHash);
                if (currentCommitIndex < 1)
                {
                    NextCommitHash = "0";
                }
                else
                {
                    var nextCommitIndex = currentCommitIndex - 1;
                    NextCommitHash = hashes[nextCommitIndex];
                }]]>
        </Code>
    </Task>
</UsingTask>
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文