- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章C#/.NET使用git命令行来操作git仓库的方法示例由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
我们可以在命令行中操作 git,但是作为一名程序员,如果在大量重复的时候还手动敲命令行,那就太笨了.
本文介绍使用 C# 编写一个 .NET 程序来自动化地使用 git 命令行来操作 git 仓库.
这是一篇很基础的入门文章.
。
。
在 .NET 中,运行一个命令只需要使用 Process.Start 开启一个子进程就好了。于是要运行一个 git 命令,我们其实只需要这句足以:
1
|
Process.Start(
"git"
,
"status"
);
|
当然,直接能简写成 git 是因为 git.exe 在我的环境变量里面,一般开发者在安装 Git 客户端的时候,都会自动将此命令加入到环境变量。如果没有,你需要使用完整路径 C:\Program Files\Git\mingw64\bin\git.exe 只是每个人的路径可能不同,所以这是不靠谱的.
。
。
对于上节中写的 Process.Start ,你一眼就能看出来这是完全没有用的代码。因为 git status 命令只是获得仓库当前的状态,这个命令完全不影响仓库,只是为了看状态的.
所以,命令最好要能够获得输出.
而要获得输出,你需要使用 ProcessStartInfo 来指定如何启动一个进程.
1
2
3
4
5
6
7
|
var info =
new
ProcessStartInfo(ExecutablePath, arguments)
{
CreateNoWindow =
true
,
RedirectStandardOutput =
true
,
UseShellExecute =
false
,
WorkingDirectory = WorkingDirectory,
};
|
需要设置至少这四个属性:
CreateNoWindow
表示不要为这个命令单独创建一个控制台窗口实际上如果使用此代码的程序也是一个控制台程序,这句是没有必要的,因为子进程会共用父进程的控制台窗口;但是对于 GUI 程序来说,这句还是很重要的,这可以避免在执行命令的过程中意外弹出一个黑色的控制台窗口出来.
RedirectStandardOutput
进行输出的重定向这是一定要设置为 true 的属性,因为我们希望拿到命令的输出结果.
WorkingDirectory
设置工作路径本来这是一个可选设置,不过对于 git 命令来说,一般都是对一个已有的 git 仓库进行操作,所以当然要指定一个合理的 git 仓库了.
UseShellExecute
设置为 false
表示不要使用 ShellExecute
函数创建进程此属性的详细说明, 。
UseShellExecute 的默认值是 true.
如果有以下需求,那么建议设置此值为 false:
如果你有以下需求,那么建议设置此值为 true 或者保持默认:
这里我们必须指定为 false ,因为要重定向输出的话,这是唯一有效值。顺便一提,此属性如果不设置,默认值是 true .
。
。
为了方便起见,我将全部运行一个命令的代码封装到了一个 CommandRunner 的类当中.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
|
using
System;
using
System.Diagnostics;
using
System.IO;
namespace
Walterlv.GitDemo
{
public
class
CommandRunner
{
public
string
ExecutablePath {
get
; }
public
string
WorkingDirectory {
get
; }
public
CommandRunner(
string
executablePath,
string
workingDirectory =
null
)
{
ExecutablePath = executablePath ??
throw
new
ArgumentNullException(nameof(executablePath));
WorkingDirectory = workingDirectory ?? Path.GetDirectoryName(executablePath);
}
public
string
Run(
string
arguments)
{
var info =
new
ProcessStartInfo(ExecutablePath, arguments)
{
CreateNoWindow =
true
,
RedirectStandardOutput =
true
,
UseShellExecute =
false
,
WorkingDirectory = WorkingDirectory,
};
var process =
new
Process
{
StartInfo = info,
};
process.Start();
return
process.StandardOutput.ReadToEnd();
}
}
}
|
。
。
以上 CommandRunner 命令的使用非常简单, new 出来之后,得到一个可以用来执行命令的实例,然后每次执行调用 Run 方法传入参数即可.
1
2
3
|
var
git =
new
CommandRunner(
"git"
, @
"D:\Developments\Blogs\walterlv.github.io"
);
git.Run(
"add ."
);
git.Run(@
"commit -m "
"这是自动提交的"
""
);
|
如果需要获得命令的执行结果,直接使用 Run 方法的返回值即可.
比如下面我贴了 Main 函数的完整代码,可以输出我仓库的当前状态:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
using
System;
namespace
Walterlv.GitDemo
{
class
Program
{
static
void
Main(
string
[] args)
{
Console.WriteLine(
"walterlv 的自动 git 命令"
);
var git =
new
CommandRunner(
"git"
,
@"D:\Developments\Blogs\walterlv.github.io"
);
var status = git.Run(
"status"
);
Console.WriteLine(status);
Console.WriteLine(
"按 Enter 退出程序……"
);
Console.ReadLine();
}
}
}
|
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我.
原文链接:https://blog.walterlv.com/post/run-commands-using-csharp.html 。
最后此篇关于C#/.NET使用git命令行来操作git仓库的方法示例的文章就讲到这里了,如果你想了解更多关于C#/.NET使用git命令行来操作git仓库的方法示例的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
Hortonworks 数据平台 HDP 3.0 有 spark 2.3 和 Hive 3.1,默认情况下 spark 2.3 应用程序(pyspark/spark-sql 等)使用 spark 数据
是否最好让一个软件仓库包含多个文件夹,这些文件夹映射到工作区中的不同路径。或者一个仓库中的多个文件夹映射到多个工作区,或多个仓库映射到多个工作区。 有人对此事有任何实用建议吗? 我还注意到,当我在仓库
Git 是分布式源代码控制系统,对吧。如何在没有集中存储库的情况下连接两个开发人员。 我们的团队使用 Github,如果两个开发人员想在同一个分支上工作,似乎需要将该分支推送到远程,然后他们才能访问它
Maven – 仓库 什么是 Maven 仓库? 在Maven 的术语中,仓库是一个位置(place),例如目录,可以存储所有的工程 jar 文件、library jar 文件、插件或任何其他的工
关闭。这个问题需要更多focused .它目前不接受答案。 想改善这个问题吗?更新问题,使其仅关注一个问题 editing this post . 3年前关闭。 Improve this questi
我开始将 git 与我的 .git 目录以及网络根目录中的其他所有内容一起使用。进一步阅读后,这似乎是一种不好的做法。我现在将我的应用程序和系统文件夹放在网络根目录之外。我的网络根目录中唯一剩下的就是
有没有可能没有历史的 Git 仓库?例如,我有一个我工作的本地 Git 存储库,我想将最新版本推送到生产服务器。生产服务器上不应存储任何历史记录。我该怎么做? 最佳答案 你可以看到命令 git arc
Laravel 中的 Repositories 有什么优势?它似乎是从应用程序的业务逻辑中抽象出模型层。虽然这似乎只是让整个请求生命周期变得更加复杂,但收效甚微。 有人可以阐明 Laravel 存储库
我有一个本地 git 服务器在我的 NAS 上运行,我正在我的笔记本电脑和工作站上进行开发,所有这些都在我的本地网络中。所以,如果我想在一个新的空 repo 中开始一个项目,我会关注 this ans
我们正在使用 SVN 来存储 maven 依赖项(组织限制不能像现在那样使用 nexus 或 artifactory maven 存储库)。 SVN 在使用 https 协议(protocol)的网络
我想允许某人查看我在我的私有(private)存储库中所做的工作。我该怎么做? 我看了https://help.github.com/articles/making-a-private-reposit
我试图阻止同事在 git 中再次推送已删除的标签(因为它被错误地推送了一次)。 我知道如何在本地执行此操作以及如何将其推送到远程以及如何指示我的同事以正确的方式从他们的本地存储库中删除已删除的标签。
我已经使用 url 克隆了一个 friend 的 git repo git 克隆 https://github.com/user/repo_name.git 然后我创建了我的分支,提交并尝试将我的代码
我目前正在我的代理机构安排比赛。我想对开发人员可以使用的模块进行一些管理。 是否可以托管 Play 模块和 Maven 库的镜像存储库并将 play 配置为仅使用这些存储库? 我已阅读此内容 docu
我正在尝试在我的 readme.md 中嵌入图像用于在 GitHub 上显示。我以前在公共(public)存储库中没有遇到任何问题,格式如下: ![header image](https://raw.
我想访问公司内部Artifactory实例上自定义开发的Gradle插件。对于公司内部发生的每一个Gradle构建,我都希望如此。我是否缺少任何东西,或者建议的方法是在每个项目的每个Gradle构建之
我想保留我在 docker hub 帐户中使用的图像,同时保持对拉取图像的引用。就像你在 github 上 fork 一个项目一样。 目前我已经尝试过jwilder/nginx-proxy图片。现在我
Perforce 中是否有命令可以获取客户端从软件仓库映射到特定文件夹的信息? 示例: 我有仓库位置//depot/myfolder/somefile.java 我想知道哪些客户端将此位置映射到哪个路
我被指派为一个项目开发一项功能。在几周的时间里,我将花几天时间研究该功能。我将克隆中央仓库。然后我将在本地工作 3 周。在此过程中,我会多次将我的进度提交到我的 repo 协议(protocol)中。
我发现自己越来越喜欢将Rstudio与R markdown文件(.rmd)一起使用,并且我非常喜欢“编织HTML +发布到Rpubs”的便利与同事共享我的工作。不幸的是,发布的文件必须是公开可见的,而
我是一名优秀的程序员,十分优秀!