项目上线需要生成上线源码清单
需要的列
源码名称,源码路径,类型,SVN版本号,提交日期,开发人员
工具:
Setup-Subversion-1.6.23.msi 对应 TortoiseSVN 1.6
Setup-Subversion-1.7.22.msi 对应 TortoiseSVN 1.7
Setup-Subversion-1.8.14.msi 对应 TortoiseSVN 1.8
下载地址:
http://happyqing.iteye.com/blog/2270112
如果Subversion版本低会报错:
svn: 警告: “D:\subversion\PRO\trunk\sourcecode\projectName”不是工作副本
svn: 路径 'D:\subversion\PRO\trunk\sourcecode\projectName' 好像是 Subversion 1.7 或更高版本的工作
副本。请升级你的 Subversion客户端,以使用此工作副本。
命令:
安装好后,先配置环境变量。
svn stauts:从本地副本统计信息
svn status -v D:\subversion\PRO\trunk\sourcecode\projectName> projectNameManifest.txt
此命令没能列出提交时间
生成这样的文本
3 3 happyqing D:\subversion\PRO\trunk\sourcecode\projectName\src\org\jeecgframework\core\annotation M 3 3 happyqing D:\subversion\PRO\trunk\sourcecode\projectName\src\org\jeecgframework\core\annotation\Ehcache.java ? 3 3 happyqing D:\subversion\PRO\trunk\sourcecode\projectName\src\org\jeecgframework\core\annotation\JeecgEntityTitle.java
第1列 第2列 第3列 第4列 第5列
状态 ? 版本号 用户名 源文件
状态是?的是本地新增的,M本地修改,还有其他的需要先处理
整理
生成的文本文件虽然可用,但是用起来太麻烦,需要整理
用程序整理后的效果:
Ehcache.java projectName\src\org\jeecgframework\core\annotation\Ehcache.java 3 2016/1/6 赵一 JeecgEntityTitle.java projectName\src\org\jeecgframework\core\annotation\JeecgEntityTitle.java 3 2016/1/6 赵一
往excel里粘贴时,右键 粘贴选项 A (只保留文本)
工具类
package util; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileWriter; import java.io.IOException; import java.io.InputStreamReader; import java.util.HashMap; import java.util.Iterator; import java.util.Map; /** * SVN源码清单 * 第一步 用svn命令生成原始清单 * svn status -v D:\subversion\PRO\trunk\sourcecode\projectName > projectNameManifest.txt * @author happyqing * @Since 2016.1.13 */ public class SVNManifest { private static String pathPrefix; private static Map<String, String> userNameMap = new HashMap<String, String>(); private static Map<String, String> directoryDateMap = new HashMap<String, String>(); /** * 读写txt文件 * @param sourceFilePath * @param destFilePath */ public static void readWriteTxt(String sourceFilePath, String destFilePath){ try { File file = new File(sourceFilePath); File dest = new File(destFilePath); //BufferedReader reader = new BufferedReader(new FileReader(file)); //乱码 BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(file),"GBK")); // 考虑到编码格式 BufferedWriter writer = new BufferedWriter(new FileWriter(dest)); String line = reader.readLine(); int readLines = 0; int writeLines = 0; while ((line = reader.readLine()) != null) { readLines++; if(validateProcess(line)){ line = processLine(line); writer.write(line); writeLines++; } } System.out.println("读入行:"+readLines); System.out.println("写入行:"+writeLines); writer.flush(); reader.close(); writer.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } /** * 判断一行是否需要处理 * @param line * @return */ public static boolean validateProcess(String line){ //?号开头的不要 if(line.startsWith("?")){ return false; } //是目录的不要 if(line.indexOf(".") < 0){ return false; } //只要resources、src、WebContent下的 // if(!(txt.indexOf("projectName\\resources\\") > -1 || txt.indexOf("projectName\\src\\") > -1 || txt.indexOf("projectName\\WebContent\\") > -1)){ // return false; // } boolean needProcess = false; //Map<String, String> map = new HashMap <String, String>(); Iterator<Map.Entry<String, String>> entries = directoryDateMap.entrySet().iterator(); while(entries.hasNext()){ Map.Entry<String, String> entry = entries.next(); if(line.indexOf(entry.getKey())> 0){ needProcess = true; } } if(!needProcess){ return false; } return true; } /** * 处理一行文本 * @param line * @return */ public static String processLine(String line){ //把空格替换为tab String str1 = line.substring(0, line.indexOf(pathPrefix)); //前半截 String str2 = line.substring(line.indexOf(pathPrefix)); //后半截,文件名中可能会有空格 line = str1.replaceAll(" +", "\t") + str2; //添加文件名列 String filePath = line.substring(line.lastIndexOf("\t")+1); String fileName = filePath.substring(filePath.lastIndexOf("\\")+1); line = line + "\t" + fileName; // + "\r\n"; //把英文用户名替换为中文 Iterator<Map.Entry<String, String>> entries = userNameMap.entrySet().iterator(); while(entries.hasNext()){ Map.Entry<String, String> entry = entries.next(); if(line.indexOf(entry.getKey()) > -1){ line = line.replaceAll(entry.getKey(), entry.getValue()); } } //添加日期列(自定义日期) Iterator<Map.Entry<String, String>> entries2 = directoryDateMap.entrySet().iterator(); while(entries2.hasNext()){ Map.Entry<String, String> entry = entries2.next(); if(line.indexOf(entry.getKey()) > -1){ line = line + "\t" + entry.getValue(); } } //换列的顺序(看需要) String[] columnArr = line.split("\t"); line = columnArr[5] + "\t" + columnArr[4] + "\t" + columnArr[2] + "\\t" + columnArr[6] + "\t" + columnArr[3]; line+="\r\n"; //去掉文件路径前缀 String pathPrefixRegex = pathPrefix.replaceAll("\\\\", "\\\\\\\\"); //System.out.println(pathPrefix); line = line.replaceAll(pathPrefixRegex, ""); return line; } /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub //文件路径前缀,会被替换为空字符串 pathPrefix = "D:\\subversion\\PRO\\trunk\\sourcecode\\"; //用户名替换为中文(也可以用Sting[][]) userNameMap.put("\tzhaoyi\t", "\t赵一\t"); userNameMap.put("\tqianer\t", "\t钱二\t"); //自定义目录的更新日期,用TortoiseSVN版本库浏览器查看 directoryDateMap.put("projectName\\resources\\", "2016/1/11"); directoryDateMap.put("projectName\\src", "2016/1/6"); directoryDateMap.put("projectName\\WebContent\\", "2015/12/30"); SVNManifest.readWriteTxt("D:\\project\\document\\projectNameManifest.txt","D:\\project\\document\\projectNameManifestFormat.txt"); } }
相关推荐
在软件开发过程中,版本控制是至关重要的,它帮助开发者跟踪代码的变更,管理不同阶段的项目状态。...这种方法尤其适用于持续集成/持续部署(CI/CD)流程,自动化的版本生成可以无缝集成到构建和发布流程中。
在软件开发过程中,版本控制是至关重要的,它...总的来说,通过集成SVN和VS,开发团队可以更有效地管理代码版本,同时自动化版本号的生成和更新过程,确保每个构建都有唯一的标识,从而提高软件的可维护性和可靠性。
SVN清单列表,通常指的是在SVN仓库中的所有文件和目录的详细列表,包括文件名、路径、版本号等信息。这个工具在Windows环境下对于项目管理和代码审查具有重要意义。它可以帮助开发者快速了解项目的状态,查看文件的...
Visual Studio(VS)作为流行的开发环境,配合Subversion(SVN)这样的版本控制系统,可以实现自动化地在编译发布时更新版本号。本文将深入探讨如何在VS中配置和实现这一功能。 首先,理解版本号的重要性。版本号...
在软件开发过程中,版本控制系统是不可或缺的工具,其中Subversion(简称svn)是一个广泛应用的集中式版本控制系统。本文将详细讲解如何配置svn的用户名和密码,以便于有效地管理和控制代码库的访问权限。 首先,...
在使用Subversion(简称svn)进行版本控制时,有时我们需要更改访问仓库的用户名和密码,例如因为人员变动或安全策略更新。本篇文章将详细介绍如何在不同的操作系统和客户端环境下,重新设置svn的用户名和密码。 ...
其中,Subversion(简称SVN)是一种广泛应用的集中式版本控制系统。本文将详细介绍如何在SVN服务器上添加新的账号及其密码,包括必要的配置步骤。 #### 二、SVN账号添加流程 添加SVN账号主要包括两个关键步骤:在`...
本文将深入探讨如何获取svn的最新版本号,并介绍一些常用的svn命令。 首先,获取svn的最新版本号通常是为了确保你正在使用的代码是最新的,避免因版本过旧而遇到已解决的问题或错过新功能。有几种方法可以获取: 1...
自动获取工程svn提交的版本号,然后修改指定dll,exe的版本信息。最好达到的效果是,每次提交完svn后重新编译代码,会将最后提交的版本号写到version里比如:2.0.0.64,;2.0是大版本号,手动修改资源信息即可,后两...
本篇将详细介绍如何在VS2017中配置自动获取SVN版本控制号,以便在每次编译时更新代码中的版本号。 首先,我们需要了解SVN版本号是什么。SVN reversion版本号是Subversion仓库中特定提交的唯一标识,它反映了代码库...
在IT行业中,版本控制系统是开发团队协作的重要工具,其中Subversion(SVN)是一个广泛应用的集中式版本控制系统。本文将详细讲解如何在MyEclipse这个集成开发环境中修改SVN的用户名和密码,以便于团队成员在遇到...
在Linux环境中,版本控制系统Subversion(SVN)是团队协作中常用的一种工具,用于管理和跟踪代码变更。然而,对于SVN管理员来说,有效地管理和分配用户密码是一项繁琐的任务,尤其是在需要频繁更改或设置新密码时。...
SVN(Subversion)是一种广泛使用的版本控制系统,用于管理和跟踪文件和目录的变更。它允许团队成员协同工作,记录每次更改,以便于回溯、合并和恢复错误。在使用SVN的过程中,用户经常需要设置用户名和密码来访问...
分享下svn状态统计工具SvnStat 是开源的 在源码的基础上我做了些改动 现在已经是重新打好的jar包了 使用方法很简单 无需checkout配置库到本地 方法如下: 1 打开cmd 获取配置库指定日期内的log: svn log ...
maven 简单实用的配置,打包,获取svn版本号、仓库等等实用
在windows环境下,提交代码到svn中,使用钩子脚本,获取项目名称,提交人,提交时间,提交的日志信息,版本号,纯bat脚本。ps:不是pre-commit.bat文件,因为在该文件中获取不到真正的版本号。
C.) 根据 SVN 版本库和代码库的版本号,当前时间戳自劢生成编译版本号。 D.) 自劢检测是否在 linux 版本库中生成版本文件夹,如 V0, V1 …等。 E.) 根据自劢生成的编译版本号替换编译版本中 buildinfo.sh 的版本号。...
SVN(Subversion)是一种广泛使用的版本控制系统,用于管理和跟踪文件和目录的变更。这个压缩包文件中的内容看起来是关于SVN密码和用户名找回的源代码,这通常涉及到安全性和认证过程。以下是对这些文件的详细解读:...
在使用Eclipse集成的Subversion(SVN)客户端进行代码版本控制时,我们经常会遇到需要修改保存在本地的SVN用户名和密码的情况。这可能是由于密码变更或是用户名需要更新所导致。为了避免每次提交或更新代码时都手动...
本文将详细介绍如何使用Java结合SVN来自动化生成H5游戏资源的版本号,以及配套程序`VersionBuilder`的工作原理。 首先,理解版本号的作用。在H5游戏中,资源版本号通常用于标识资源的更新状态,当有新的资源发布时...