有什么方法可以使用.NET应用程序使用git?[关闭]


69

如何从GitHub(也许也)一些文件夹?

我的意思是我需要用于.NET的API才能在C#中访问,而不是用于git的GUI。


3
@ code4life –和其他对库/工具推荐感兴趣的人–签出软件推荐Stack Exchange
肯尼·埃维特

Answers:


30

我刚刚发现了这个:http : //www.eqqon.com/index.php/GitSharp

GitSharp是针对Dot.Net Framework和Mono的Git的实现。它旨在与原始Git完全兼容,并且应该是一个轻量级的库,适用于以Git为对象数据库或以某种方式读取或操作存储库的酷应用程序。


30
如该页面所述,由于libgit2sharp看起来更有希望,他们已停止开发-github.com/libgit2/libgit2sharp
James Manning

1
不过遗憾的是,截至2013年10月,libgit2sharp尚未完全支持Pull,因为Pull = Fetch + Merge,并且尚未编写Merge。完成后会很棒!:-)
罗素·吉丁斯

3
@RussellGiddings事情发生了一些变化:合并,拉取,还原,...现在公开了;-)
nulltoken

1
这些天,libgit2sharp是更好的选择-请参见下面的答案。
乔恩(Jon Rea)

50

但是我要做的是编写一个简单的类libray通过运行子进程来调用git命令。

首先,为某些配置创建一个ProcessStartInfo。

ProcessStartInfo gitInfo = new ProcessStartInfo();
gitInfo.CreateNoWindow = true;
gitInfo.RedirectStandardError = true;
gitInfo.RedirectStandardOutput = true;
gitInfo.FileName = YOUR_GIT_INSTALLED_DIRECTORY + @"\bin\git.exe";

然后创建一个进程以实际运行命令。

Process gitProcess = new Process();
gitInfo.Arguments = YOUR_GIT_COMMAND; // such as "fetch orign"
gitInfo.WorkingDirectory = YOUR_GIT_REPOSITORY_PATH;

gitProcess.StartInfo = gitInfo;
gitProcess.Start();

string stderr_str = gitProcess.StandardError.ReadToEnd();  // pick up STDERR
string stdout_str = gitProcess.StandardOutput.ReadToEnd(); // pick up STDOUT

gitProcess.WaitForExit();
gitProcess.Close();

然后,您现在可以调用任何命令。


15
为了使编译器对此类满意,我必须添加以下行:gitInfo.UseShellExecute = false;
J Wynia

5
既然没有ssh-agent提供用于拉动和推动的键,这是否会给ssh带来麻烦?
克里斯·莫斯基尼

2
这个答案的问题如何捕获Shell命令输出的C#?有关如何一般捕获标准错误和标准输出的详细信息;如果标准错误的输出大于相关缓冲区,则这显然可能会失败。
肯尼·埃维特

8
不要同步读出错误流(WaitForExit之前的行)。如果两个都有任何数据,它将死锁。
Aleksander Stankiewicz

这是一个很好的答案,对我来说真的很好用,请注意,在.Net Core 1.0上,Process不支持Close函数
System24 Tech,

44

正如James Manning在当前接受的答案中的评论中提到的那样,库libgit2sharp是一个受积极支持的项目,为Git提供了.NET API。


不过遗憾的是,截至2013年10月,Pull不完全受支持,因为Pull = Fetch + Merge,并且尚未编写Merge。完成后会很棒!:-)
罗素·吉丁斯

3
合并现在由LibGit2Sharp ;-)公开(请参阅#608
nulltoken 2014年

2
@KennyEvitt LibGit2Sharp和LibGit2Sharp-SSH是两个不同的库-后者是LibGit2Sharp的分支,缺乏官方支持,已经破坏了Nuget包,通常是“脱离网格”的库。当使用低级非托管代码时,除非您有包装本机函数的经验,否则您会遇到脱离网格的麻烦(内存泄漏,不良的异常处理)。
道格

3
从1/2020开始,lib2git STILL不能处理Windows上的长路径。如果这是一个问题,您只需要将shell打包到git中即可。
hcoverlambda

1
@Liam这似乎并不完全正确。当然,开发的频率要低得多,并且涉及的更改较小,但这对于“成熟的”库或程序来说是很典型的。就个人而言,这种事情不再困扰我。我经常使用“旧”代码,并且经常遇到对我完全不起作用的“新”代码。通常,最重要的标准是是否遇到了可能无法解决的问题。这里很多在GitHub的项目寿悬而未决的问题。
肯尼·埃维特
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.