我正在尝试使用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
没有失败。这里有什么建议吗?我是否通过该过程正确触发了命令?