使用 SVN 作为版本控制的时候,整理过一个 导出文件脚本:利用 PHP 导出 SVN 新增或修改过的文件

现在换成了 Git,整理出类似的脚本:

【第一版】git.php

<?php
/**
* 导出指定版本之间的差异文件,如 100 和 200 之间的差异则导出 100(不包括) - 200(包括) 的所有修改
* 【Git 命令行】
* 1、查看版本间差异
* git diff b361dbd323dbfc442ddbdc43b00cba3e66c50214 988526fa12dfcbddc2462e232eae7f614ff28976 --name-status
*
* @example git.php old版本号 new版本号
* @author phpgo.cnblogs.com
*/ // 根目录
define('SITE_PATH', '/Users/jianbao/123'); // Git 工作区
define('GIT_WORK_PATH', '/Users/jianbao/PhpStormProjects/fiisoo/git_sjf_web'); // 项目路径前缀
$prefix = 'sjf_'; $error_msg = "You must useage like {$_SERVER['argv'][0]} old_version(不包括) new_version(包括)\n";
if ($_SERVER['argc'] != 3) {
echo $error_msg;
exit(1);
} $old_version = $_SERVER['argv'][1];
$new_version = $_SERVER['argv'][2]; //$export_path = SITE_PATH . "/${prefix}${old_version}_${new_version}";
$export_path = SITE_PATH . "/${prefix}" . date('H:i:s'); // 切换至 Git 工作区
chdir(GIT_WORK_PATH); echo "开始分析版本差异...\n";
$diff_cmd = "git diff ${old_version} ${new_version} --name-status"; exec($diff_cmd, $diff_list, $return);
$diff_list = (array)$diff_list;
foreach ($diff_list as $diff_info) {
echo $diff_info . "\n";
} // 清空旧数据
@system('rm -rf ' . SITE_PATH . "/${prefix}*"); // 新建文件夹
dir_mkdir($export_path); $diff_count = count($diff_list);
if ($diff_count < 1) {
echo "版本间没有差异\n";
exit(1);
} $diff_count = 0; // 导出版本差异文件
echo "开始导出...\n";
foreach ($diff_list as $diff_info) {
if (preg_match('/([\w]+)\s+(.+)/', $diff_info, $matches)) {
$git_file_mode = $matches[1];
$git_file_name = $matches[2]; // A、M、D、AM(即增加且修改)
// 文件被删除
if ($git_file_mode == 'D') {
continue;
}
$diff_count++; // 复制到导出目录
$from_file_path = GIT_WORK_PATH . '/' . $git_file_name;
$to_file_path = $export_path . '/' . $git_file_name;
$to_file_dir = dirname($to_file_path);
dir_mkdir($to_file_dir); copy($from_file_path, $to_file_path);
}
} echo "共导出${diff_count}个差异文件\n";
exit(0); /**
* 创建文件夹
*
* @param string $path 文件夹路径
* @param int $mode 访问权限
* @param bool $recursive 是否递归创建
* @return bool
*/
function dir_mkdir($path = '', $mode = 0777, $recursive = true) {
clearstatcache();
if (!is_dir($path)) {
mkdir($path, $mode, $recursive);
return chmod($path, $mode);
} return true;
} /**
* 写文件
*
* @param string $filename 文件名
* @param string $text 要写入的文本字符串
* @param string $openmod 文本写入模式('w':覆盖重写,'a':文本追加)
* @return bool
*/
function file_write($filename = '', $text = '', $openmod = 'w') {
if (@$fp = fopen($filename, $openmod)) {
flock($fp, 2);
fwrite($fp, $text);
fclose($fp);
return true;
} else {
return false;
}
} /**
*【本地调试用】写对象(包括 数字、字符串、数组)
*
* @param string $text 要写入的文本字符串
* @param string $type 文本写入类型('w':覆盖重写,'a':文本追加)
* @return bool
*/
function write2($text, $type = 'a') {
$filename = SITE_PATH . '/write2.txt'; $text = "\n++++++++++++++++++++++++++++++++++++++++++\n"
. date('Y-m-d H:i:s') . "\n"
. print_r($text, true);
return file_write($filename, $text, $type);
}

【第二版】git_sjf_mas.php

<?php
/**
* 导出 某个分支(如:master/develop) 下,指定版本之间的差异文件,
* 如 100 和 200 之间的差异则导出 100(不包括) - 200(包括) 的所有修改
*
* @example git_sjf_mas.php old版本号 new版本号
* @author phpgo.cnblogs.com
*/ // 检查参数
$errorMsg = "【出错】You must useage like {$_SERVER['argv'][0]} old_version(不包括) new_version(包括)\n";
if ($_SERVER['argc'] != 3) {
echo $errorMsg;
exit(1);
} //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // 项目路径
$projectUrl = 'git@git.cnblogs.com:phpgo/sjf_web.git'; // 分支名
$branchName = 'master'; // 开发分支 改为 develop // 本地项目名
$projectName = 'git_sjf_mas'; // 开发分支 改为 git_sjf_dev // 输出路径
$exportPath = '/Users/jianbao/123'; // Git 工作区
$gitWorkPath = '/Users/jianbao/1/projects'; //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ $subGitWorkPath = $gitWorkPath . "/${projectName}"; // 克隆 远程 develop 分支
if (!is_dir($subGitWorkPath)) {
// 切换至 Git 工作区
chdir($gitWorkPath); // 克隆 分支
system("git clone ${projectUrl} --branch ${branchName} ${subGitWorkPath}"); // 新建本地分支 develop
chdir($subGitWorkPath);
system("git branch ${branchName}");
} else {
chdir($subGitWorkPath);
} // 切换分支 develop
system("git checkout ${branchName}"); // 更新分支
system("git pull origin ${branchName}"); $oldVersion = $_SERVER['argv'][1];
$newVersion = $_SERVER['argv'][2]; // 检查 版本号
$oldVersionCmd = "git log --pretty='%h' -1 ${oldVersion}";
$newVersionCmd = "git log --pretty='%h' -1 ${newVersion}";
$ret = 0;
system($oldVersionCmd, $ret);
if ($ret !== 0) {
echo "【出错】版本号 ${oldVersion} 不存在\n";
exit(1);
} system($newVersionCmd, $ret);
if ($ret !== 0) {
echo "【出错】版本号 ${newVersion} 不存在\n";
exit(1);
} // 输出路径
$subExportPath = $exportPath . "/${projectName}_" . date('H:i:s'); echo "开始分析版本差异...\n";
$diffCmd = "git diff --name-status ${oldVersion} ${newVersion}"; exec($diffCmd, $diffList, $return);
$diffList = (array)$diffList;
foreach ($diffList as $diffInfo) {
echo $diffInfo . "\n";
} // 清空旧数据
//@system('DELTREE ' . $exportPath . "/${projectName}*"); $dh = opendir($exportPath);
while ($file = readdir($dh)) {
if ($file != "." && $file != "..") {
$fullpath = $exportPath . "/" . $file;
if (is_dir($fullpath) && (strpos($file, $projectName) !== false)) {
dir_rmdir($fullpath);
}
}
}
closedir($dh); // 新建文件夹
dir_mkdir($subExportPath); $diffCount = count($diffList);
if ($diffCount < 1) {
echo "版本间没有差异\n";
exit(1);
} $diffCount = 0; // 导出版本差异文件
echo "开始导出...\n";
foreach ($diffList as $diffInfo) {
if (preg_match('/([\w]+)\s+(.+)/', $diffInfo, $matches)) {
$gitFileMode = $matches[1];
$gitFileName = $matches[2]; // A、M、D、AM(即增加且修改)
// 文件被删除
if ($gitFileMode == 'D') {
continue;
}
$diffCount++; // 复制到导出目录
$fromFilePath = $subGitWorkPath . '/' . $gitFileName;
$toFilePath = $subExportPath . '/' . $gitFileName;
$toFileDir = dirname($toFilePath);
dir_mkdir($toFileDir); copy($fromFilePath, $toFilePath);
}
} echo "共导出 ${diffCount} 个差异文件\n";
exit(0); //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ /**
* 创建文件夹
*
* @param string $path 文件夹路径
* @param int $mode 访问权限
* @param bool $recursive 是否递归创建
* @return bool
*/
function dir_mkdir($path = '', $mode = 0777, $recursive = true) {
clearstatcache();
if (!is_dir($path)) {
mkdir($path, $mode, $recursive);
return chmod($path, $mode);
} return true;
} /**
* 清空/删除 文件夹
*
* @param string $dir 文件夹路径
* @param bool $self 是否删除自己
* @return bool
*/
function dir_rmdir($dir, $self = true) {
$dh = opendir($dir);
while ($file = readdir($dh)) {
if ($file != "." && $file != "..") {
$fullpath = $dir . "/" . $file;
if (!is_dir($fullpath)) {
unlink($fullpath);
} else {
dir_rmdir($fullpath);
}
}
}
closedir($dh);
if ($self&& rmdir($dir)) {
return true;
} else {
return false;
}
} /**
* 写文件
*
* @param string $filename 文件名
* @param string $text 要写入的文本字符串
* @param string $openmod 文本写入模式('w':覆盖重写,'a':文本追加)
* @return bool
*/
function file_write($filename = '', $text = '', $openmod = 'w') {
if (@$fp = fopen($filename, $openmod)) {
flock($fp, 2);
fwrite($fp, $text);
fclose($fp);
return true;
} else {
return false;
}
} /**
*【本地调试用】写对象(包括 数字、字符串、数组)
*
* @param string $text 要写入的文本字符串
* @param string $type 文本写入类型('w':覆盖重写,'a':文本追加)
* @return bool
*/
function write2($text, $type = 'a') {
$filename = $GLOBALS['exportPath'] . '/write2.txt'; $text = "\n++++++++++++++++++++++++++++++++++++++++++\n"
. date('Y-m-d H:i:s') . "\n"
. print_r($text, true);
return file_write($filename, $text, $type);
}

利用 PHP 导出 Git 某个分支下,新增或修改过的文件的更多相关文章

  1. Mac Pro 利用PHP导出SVN新增或修改过的文件

    先前在 Windows 操作系统下,习惯用 TortoiseSVN 导出新增或修改过的文件([相当实用]如何让TortoiseSVN导出新增或修改过的文件 ),最近换成了 Mac Pro 笔记本电脑, ...

  2. 如何让TortoiseSVN导出新增或修改过的文件

    利用Windows系统下的TortoiseSVN客户端,可以导出指定版本之间修改过的文件,并保留完整的文件夹结构.下面我就来说说操作的步骤: 1.在网站项目的根目录下右键选择 “TortoiseSVN ...

  3. 【相当实用】如何让TortoiseSVN导出新增或修改过的文件

    当一个网站项目进入运营维护阶段以后,不会再频繁地更新全部源文件到服务器,这个时间的修改大多是局部的,因此更新文件只需更新修改过的文件,其他没有修改过的文件就没有必要上载到服务器.但一个稍微上规模的网站 ...

  4. 在git多分支repo仓库中彻底清除大文件

    坑的由来 repo中不小心上传了许多测试生成的data.结果可想而知,原本只有代码的仓库突然间变得无比臃肿(或者是慢慢臃肿),从早期的几十MB,迅速飙升至1G. 到底发生了什么 早些时候我对git的原 ...

  5. Linux系统下查找最近修改过的文件

    Linux的终端上,没有windows的搜索那样好用的图形界面工具,但find命令确是很强大的. 比如按名字查找一个文件,可以用 find / -name targetfilename . 唉,如果只 ...

  6. Git查看两个版本之间修改了哪些文件

    gdiff 63e3b647d55fcc643e793e650c893be8601719b1 548cdaf01dbc2f08d1ca0b697a24afe512b75a2f --stat git l ...

  7. Lunix/Mac下根据最后修改时间复制文件和文件夹,保持原有的目录结构

    度娘知道:http://zhidao.baidu.com/link?url=DD47jm6qDgT7yxsnz9e-NC4Fqd33oRoiIwcGLkw5TL4cbf50VKY2IONbHKH0IE ...

  8. git的介绍、git的功能特性、git工作流程、git 过滤文件、git多分支管理、远程仓库、把路飞项目传到远程仓库(非空的)、ssh链接远程仓库,协同开发

    Git(读音为/gɪt/)是一个开源的分布式版本控制系统,可以有效.高速地处理从很小到非常大的项目版本管理. [1] 也是Linus Torvalds为了帮助管理Linux内核开发而开发的一个开放源码 ...

  9. 使用git创建分支

    Git大法好--3.Git分支本地操作详解 这时已经切换到了dingBranch分支下面了,在项目文件夹下添加一个dingBranchtest.txt文件,然后提交到本地仓库和远程仓库: git ad ...

随机推荐

  1. 服务器环境配置安装(mysql+redis+nodejs+nginx)

    公司用来测试的服务器挂了,最后重装了系统,需要重新配置程序运行环境,linux上安装不是很熟悉,特此记录一下. 首先获取系统版本信息: 参考:获取Linux系统版本信息 一.mysql 1. 安装 安 ...

  2. sql 循环语句几种方式(变量循环,游标循环,事务)

    --第一   ) ,),Orders )) declare @n int,@rows int --select @rows=count(1) from pe_Orders select @rows = ...

  3. Spring中构造器、init-method、@PostConstruct、afterPropertiesSet孰先孰后,自动注入发生时间以及单例多例的区别、SSH线程安全问题

    首先明白,spring的IOC功能需要是利用反射原理,反射获取类的无参构造方法创建对象,如果一个类没有无参的构造方法spring是不会创建对象的.在这里需要提醒一下,如果我们在class中没有显示的声 ...

  4. Robotium_断言方法assert、is、search

    下面的这些方法都主要用来判断测试结果是否与预期结果相符,一般把is和search方法放在assert里面判断.assert最常用的还是assertThat方法,是Junit的判断,这里就不多说了.断言 ...

  5. sphinx 同时使用多个索引进行检索探究

    2014年2月15日 11:24:34 结论: 1.一次性使用多个索引进行查询的时候,返回的结果集中的fields字段没有什么清楚的意义(也没有找到文档对它的说明) 2.如果程序中一次搜索使用了多个索 ...

  6. javascript之继承

    主要是参考了<JavaScript高级程序设计(第三版)>这本书,根据自己的理解,做了下面的记录 继承是面向对象(OO)语言里面的概念,有俩种继承方式:接口继承和实现继承.接口继承只继承方 ...

  7. python基础类型 —— Sets集合

    集合(set)是一个无序不重复元素的序列. 基本功能是进行成员关系测试和删除重复元素. 运行结果如下: sets其他操作: myset.add('x') # 添加一项 myset.update([10 ...

  8. C#用Oracle.DataAccess中连接Oracle要注意版本问题!

    客户端Oracle.DataAccess.dll与服务器版本不一致时,如下修改:1.在客户端Web.config中,增加如下配置:<runtime> <assemblyBinding ...

  9. 解决Only a type can be imported. * resolves to a package

    HTTP Status 500 - Unable to compile class for JSP: type Exception report message Unable to compile c ...

  10. 富文本编辑器&FileReader

    最近在做一个web版的管理Tool,其中包括一个编辑框,要求能够编辑文字,插入图片,最后导出做成一个Html.对于资深人士看来,这很容易啊,不就是一个富文本编辑框吗?这其实就是一个概念的问题,对有经验 ...