0

我正在尝试使用Process. 传递给 git-cmd.exe 的以下命令git diff在 2 个分支之间发生时成功运行。

git init
git remote add origin "<repo-name>"
git fetch origin <branch1>
git fetch origin <branch2>
git diff --name-only --diff-filter=d <branch1>:<folder1> <branch2>:<folder1>

<folder1>我需要在给定的分支之间找到仅修改或添加的文件名。我通过将它们作为 a 传递string[]给函数来执行这些命令。

Public Function RunAndReturnExitCode(ByVal Command As String(), ByVal Directory As String,
                                         Optional ByVal MaximumWaitTime As Integer = -1,
                                         Optional ByRef Output As String = Nothing,
                                         Optional ByRef Errors As String = Nothing) As String
        Dim exePath As String = "C:\Program Files (x86)\PortableGit\git-cmd.exe"
        Dim si As ProcessStartInfo = New ProcessStartInfo(exePath)
        si.RedirectStandardInput = True
        si.RedirectStandardOutput = True
        si.RedirectStandardError = True
        si.UseShellExecute = False
        si.WorkingDirectory = Directory

        Dim p As Process = Process.Start(si)

        With p.StandardInput
            .WriteLine("cd /d """ & Directory & """")
            Array.ForEach(Command, Sub(c) .WriteLine(c))
            .WriteLine("exit")
        End With
        p.WaitForExit(MaximumWaitTime)
        Output = p.StandardOutput.ReadToEnd()
        Errors = p.StandardError.ReadToEnd()
        Return p.ExitCode.ToString()
    End Function

由于性能问题,我们现在开始处理标签。所以,我现在正在做:

git init
git remote add origin "<repo-name>"
git fetch origin refs/tags/[tag1]
git fetch origin refs/tags/[tag2]
git diff --name-only --diff-filter=d [tag1]:[folder1] [tag2]:[folder1]

在这里,diff 命令失败:

致命:无效的对象名称“[tag1]”。

我尝试从 手动运行一些命令git-cmd.exe,但我发现git checkout refs/tags/[tag1]自己失败了:

错误:pathspec '[tag1]' 与 git 已知的任何文件都不匹配。

这是否意味着我的本地存储库没有任何信息[tag1]?如果没有,那么为什么在获取它们时没有错误?任何人都可以在这里提出建议,我如何才能只获取这两个标签并在它们之间做一个差异?
试过git diff tag1 tag2,但它失败了:

致命:不明确的参数“[tag1]”:未知修订版或路径不在工作树中。

请让我知道是否需要我在这里提供更多输入。另外,我不能做 agit fetch --tags因为它挂起(我想,不是这里的问题,因为单独获取标签不会挂起)。补充一点,我的组织不允许使用https://github.com/libgit2/libgit2sharp/

编辑:
正如@torek 所建议的,agit fetch refs/tags/tag1是一种错误的方法。我现在已将其更新为:

git fetch origin +refs/tags/tag1:refs/tags/tag1 +refs/tags/tag2:refs/tags/tag2

该命令运行良好git-cmd.exe,我能够获得差异。但是当我通过process. 我的 SSH 存储库没有密码短语,因此可以肯定它RSA Aunthentication没有失败。这里有什么建议吗?我是否通过该过程正确触发了命令?

4

1 回答 1

0

这个:

git fetch origin refs/tags/[tag1]

是错误的,因为它获得了所需的提交,但没有在您的存储库中写入任何名称。提交现在可以通过 获得FETCH_HEAD,但只能在下一次之前获得git fetch。那是:

git fetch origin refs/tags/[tag2]

获得所需的提交,但覆盖FETCH_HEAD,因此现在您拥有的唯一名称 - <code>FETCH_HEAD - 仅指第二个所需的提交。

要解决此问题,您可以同时获取并丢弃它们的标签名称,但现在有两个哈希 ID FETCH_HEAD(您必须自己检索它们),或者您可以直接git fetch创建或更新您的和名称:refs/tags/tag1refs/tags/tag2

git fetch origin +refs/tags/tag1:refs/tags/tag1 +refs/tags/tag2:refs/tags/tag2

冒号和第二个名称提供了Git 存储库中对 create-or-update的引用的名称。前面的加号+表示git fetch应该强制执行此特定更新,即它应该覆盖任何以前的同名标记。

当然,git fetch --tags应该工作。(git pull --tags表示运行git fetch --tags,然后运行第二个 Git 命令,可能git merge。如果您不想自动运行任何第二个 Git 命令,请不要使用git pull。)如果挂起,可能值得调查原因:它所做的只是调用其他 Git 和 any 一样git fetch,但这次也是 fetch refs/tags/*:refs/tags/*

于 2019-11-14T18:18:33.663 回答