2019-8-4-自动更新所有-Git-仓库
| title | author | date | CreateTime | categories |
|---|---|---|---|---|
|
自动更新所有 Git 仓库
|
lindexi
|
2019-08-04 14:44:59 +0800
|
2019-08-01 20:31:41 +0800
|
git
|
我在本地添加了很多开源项目,我写了一个脚本可以每天自动从开源项目更新代码
我在写开源项目的时候,在需要写之前更新项目,但是每次更新都需要等很久,能否可以自动更新开源项目的代码,这样每次需要更新的就很少,提高开发的速度。我找到了 Git 的命令可以更新项目,本文主要就是通过写一个程序自动使用 Git 命令更新
可以通过找到所有 Git 文件夹,执行 git fetch --all 命令更新项目
所以步骤就是写 cmd 命令行调用,然后写 Git 命令,接着是找到磁盘的所有 Git 文件夹,然后调用 Git 命令更新
写一个类执行 cmd 命令
public static class Control
{
static Control()
{
Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
} public static string Command(string str)
{
// string str = Console.ReadLine();
//System.Console.InputEncoding = System.Text.Encoding.UTF8;//乱码 Process p = new Process
{
StartInfo =
{
FileName = "cmd.exe",
UseShellExecute = false, //是否使用操作系统shell启动
RedirectStandardInput = true, //接受来自调用程序的输入信息
RedirectStandardOutput = true, //由调用程序获取输出信息
RedirectStandardError = true, //重定向标准错误输出
CreateNoWindow = true, //不显示程序窗口
StandardOutputEncoding = Encoding.GetEncoding("GBK") //Encoding.UTF8
//Encoding.GetEncoding("GBK");//乱码
}
}; p.Start(); //启动程序 //向cmd窗口发送输入信息
p.StandardInput.WriteLine(str + "&exit"); p.StandardInput.AutoFlush = true;
//p.StandardInput.WriteLine("exit");
//向标准输入写入要执行的命令。这里使用&是批处理命令的符号,表示前面一个命令不管是否执行成功都执行后面(exit)命令,如果不执行exit命令,后面调用ReadToEnd()方法会假死
//同类的符号还有&&和||前者表示必须前一个命令执行成功才会执行后面的命令,后者表示必须前一个命令执行失败才会执行后面的命令 bool exited = false; // 超时
Task.Run(() =>
{
Task.Delay(TimeSpan.FromMinutes(1)).ContinueWith(_ =>
{
if (exited)
{
return;
} try
{
if (!p.HasExited)
{
Console.WriteLine($"{str} 超时");
p.Kill();
}
}
catch (Exception e)
{
Console.WriteLine(e);
}
});
}); //获取cmd窗口的输出信息
string output = p.StandardOutput.ReadToEnd();
//Console.WriteLine(output);
output += p.StandardError.ReadToEnd();
//Console.WriteLine(output); //StreamReader reader = p.StandardOutput;
//string line=reader.ReadLine();
//while (!reader.EndOfStream)
//{
// str += line + " ";
// line = reader.ReadLine();
//} p.WaitForExit(); //等待程序执行完退出进程
p.Close(); exited = true; return output + "\r\n";
}
}
然后需要有一个类可以用于通过命令行调用 Git 执行代码
public class GitCommand
{
/// <inheritdoc />
public GitCommand(DirectoryInfo repo)
{
Repo = repo;
} public DirectoryInfo Repo { get; } public void FetchAll()
{
Control("fetch --all");
} private string Control(string str)
{
str = FileStr() + str;
Log(str);
str = RegeejairhemFurwhurrahuki.Control.Command(str); Log(str);
return str;
} private static void Log(string str)
{
Console.WriteLine(str);
} private string FileStr()
{
return string.Format(GitStr, Repo.FullName);
} private const string GitStr = "git -C {0} ";
}
不知道有没小伙伴找到一个好用的执行 Git 命令的库
然后找到磁盘所有 Git 文件夹修改项目
static void Main(string[] args)
{
List<DirectoryInfo> deviceList = FindDevice(); foreach (var device in deviceList)
{
Log($"开始读取{device}盘符内容");
try
{
FindDirectory(device, 10);
}
catch (Exception e)
{
Log(e.ToString());
}
} } /// <summary>
/// 寻找文件夹
/// </summary>
/// <param name="directory"></param>
/// <param name="deep">寻找深度</param>
private static void FindDirectory(DirectoryInfo directory, int deep)
{
try
{
Log($"开始读取 {directory.FullName} 文件夹,当前递归深度{deep}");
deep--;
var gitFolder = new DirectoryInfo(Path.Combine(directory.FullName, GitFolder));
if (CheckIsGitFolder(gitFolder))
{
Log($"找到{gitFolder.FullName}文件夹");
try
{
UpdateGitFile(directory);
}
catch (Exception e)
{
Log(e.ToString());
}
}
else
{
//Log($"因为{directory.FullName}不是");
if (deep == 0)
{
Log($"达到递归深度{directory.FullName}不再继续寻找子文件夹"); return;
} var subDirectoryList = directory.GetDirectories(); Log($"在{directory.FullName}找到{subDirectoryList.Length}个文件夹"); foreach (var temp in subDirectoryList)
{
FindDirectory(temp, deep);
}
}
}
catch (Exception e)
{
Log(e.ToString());
}
} private static void UpdateGitFile(DirectoryInfo directory)
{
var gitCommand = new GitCommand(directory);
gitCommand.FetchAll();
} private const string GitFolder = ".git"; /// <summary>
/// 判断当前是否一个 git 文件夹
/// </summary>
/// <param name="directory"></param>
private static bool CheckIsGitFolder(DirectoryInfo directory)
{
return directory.Exists;
} private static void Log(string str)
{
Console.WriteLine(str); //File.AppendAllText("log.txt", str + "\r\n");
} /// <summary>
/// 找到所有驱动器
/// </summary>
/// <returns></returns>
private static List<DirectoryInfo> FindDevice()
{
var deviceList = new List<DirectoryInfo>();
for (int i = 0; i < 'Z' - 'A' + 1; i++)
{
var device = (char)('A' + i) + ":\\";
if (Directory.Exists(device))
{
deviceList.Add(new DirectoryInfo(device));
}
} return deviceList;
}
代码请看 github
2019-8-4-自动更新所有-Git-仓库的更多相关文章
- 自动更新本地 GIT 仓库
随着开源软件的兴起,尤其是 GITHUB 的蓬勃发展,很多开源软件都通过 GIT 进行管理,在我的计算机上就一个目录是我关注并使用的开源软件 GIT 本地副本,如何定期更新这些仓库,一个个的更新太累人 ...
- git--编写好代码文件后更新到git仓库流程
先说一下git仓库分类: Git分为三大部分存储区域1:工作区域(就是你打开编辑器的本地代码仓库)2:提交缓存区域(使用git add 命令暂时放置的区域)3:git远程仓库(使用git push命令 ...
- 【学习总结】Git学习-本地仓库覆盖式更新对于Git仓库的影响以及pull/push到GitHub
< 许久不用Git之后的探索 > 准备日常更新自己的GitHub了.但是编写的文件平时不放在Git仓库路径下. 故测试覆盖式更新对于仓库是否有影响 直接说结论: 通过对已有库的测试发现覆盖 ...
- 更新本地git仓库的远程地址(remote地址)
如果远程仓库的地址更新了,我们本地仓库就需要更新remote地址, 可以通过git remote -v或者cat .git/config查看通信方式及远程地址 更新远程地址的方式有两种: 第一种方式: ...
- 自动提交本地git仓库脚本
#! /bin/bash git_user_name=`git config user.name` git_user_mail=`git config user.email` branch_name= ...
- 提交代码到远程GIT仓库,代码自动同步到远程服务器上。
现在一般都会通过github,gitlab,gitee来管理我们的代码.我们希望只要我本地push了代码,远程服务器能自动拉取git仓库的代码,进行同步. 这就需要用到各仓库为我们提供的webhook ...
- 解决gitosis中authorized_keys不自动更新问题
1.拷贝一个管理员权限用户的id_rsa.pub到服务器端 这里我拷贝的是yang电脑的key,命令如下: scp /home/yang/.ssh/id_rsa.pub serveradmin@服务 ...
- git仓库下拉和上传
git仓库比较方便,可以实现白天在公司写的代码,下班之前上传到git仓库,晚上在另一台电脑上直接下拉下来,其实感觉和开发用的svn差不多 在另一篇博客里面写到,需要先在git里面新增好仓库和成员之后, ...
- git 远程版本库,github提供服务原理,git自动更新发送邮件
1.安装好Linux,安装好Git(192.168.1.239) 2.创建一个用户zph(让此用户提供git on server),密码设置为12345678 # useradd zph # pass ...
- Git github webhook 自动更新/部署代码 php自动更新脚本
这几天尝试了利用github的webhook,当代码更新到github,我们的测试服务器自动更新最新的gitbub仓库代码. 先列几个大概步骤,有时间再补充详细 1 . 服务器生成ssh key,一般 ...
随机推荐
- Python数据分析与展示[第三周](pandas数据类型操作)
数据类型操作 如何改变Series/ DataFrame 对象 增加或重排:重新索引 删除:drop 重新索引 .reindex() reindex() 能够改变或重排Series和DataFrame ...
- Percona XtraBackup 完全及增量备份与恢复的方法
安装及备份.恢复实现 安装:其最新版的软件可从 http://www.percona.com/software/percona-xtrabackup/ 获得.本文基于CentOS6.x的系统,因此,直 ...
- java memory allocation(转)
Java的运行时数据存储机制 Java程序在运行时需要为一系列的值或者对象分配内存,这些值都存在什么地方?用什么样的数据结构存储?这些数据结构有什么特点?本文试图说明此命题的皮毛之皮毛. 概念 对 ...
- map的三种遍历方法!
map的三种遍历方法! 集合的一个很重要的操作---遍历,学习了三种遍历方法,三种方法各有优缺点~~ /* * To change this template, choose Tools | Te ...
- phpcms信息模型使用
PHPCMS V9 分类信息模型测试版下载 安装 1.确定您的phpcms版本为20110318版本以上 2.将所有文件覆盖到网站目录下,运行install_info. 3.将文件中所有的phpcms ...
- Ubuntu18.04 systemd开机自启
本文是该文的整理版. Ubuntu18.04不再使用initd管理系统,改用systemd.为了像以前一样,在/etc/rc.local中设置开机启动程序,需要以下几步: 1.systemd默认读取/ ...
- C#面向对象基础 —— 类与对象
文章来源: https://www.cnblogs.com/huluobozu/p/5070500.html 一.类与对象 类是面向对象编程的基本单元:类造出来的变量叫对象. 一个类包含俩种成员:字段 ...
- Atcoder Tenka1 Programmer Contest D: IntegerotS 【思维题,位运算】
http://tenka1-2017.contest.atcoder.jp/tasks/tenka1_2017_d 给定N,K和A1...AN,B1...BN,选取若干个Ai使它们的或运算值小于等于K ...
- SpringMVC method属性与http请求方法一致
在springMVC中,@requestMapping注解有method属性,在没有指定method的值时,默认映射所有http请求方法,如果仅想接收一种请求方法,需用method=RequestMe ...
- Docker 学习笔记 2019-05-27
Docker 学习笔记 2019-05-27 可以很方便的打包应用. 使用 docker-compose 更方便. 每个发行版安装方式不一样,如果 centos 直接安装很可能会安装成旧版本. Lin ...