开始前的准备
操作系统: windows
工具:
-
phpstorm或webstorm
svn需要1.7以上的版本,1.7以上的版本只会在根目录创建一个.svn目录。
如果需要用到svn命令行,则在安装TortoiseSVN时需要选中command line tools
选项,默认是不会安装命令行工具的。
git和svn同时作为代码版本控制工具
当版本服务器用的是svn,而本地希望使用git时,可以将git和svn结合使用。
git自带有git-svn
的命令作为和Subversion的桥接工具,具体可以参考Git与Subversion。
本文主要介绍同时使用git和TortoiseSVN两个工具的方法。
由于本人更喜欢使用命令行工具,因此以下介绍都是基于命令行。
为便于使用,可以将git和svn的bin目录放到环境变量中。
1. 拉取代码
运行Git Bash
在Git Bash
窗口中使用svn co http://svn/repo
从svn版本服务器中拉取代码
2. 配置.gitignore和.svnignore
在.gitignore
和.svnignore
分别忽略.svn
和.git
目录。
svn
忽略文件的使用可参考Subversion 忽略文件与目录
3. 本地和远程更新和提交代码
在本地使用git update
和git commit
更新和提交代码。
向远程更新和提交代码使用svn up
和svn ci
。
ignore-on-commit
有时候,本地修改的文件不希望提交到版本服务器。此时可以将代码分配到不同的changelist
中,将要提交的代码加入到work
的changelist中,不想提交的代码加入到ignore-on-commit
的changelist
,在提交时只提交work
的changelist就可以了。
具体代码如下:
D:\workspace\trunk>svn cl work . -R
Skipped '.'
Skipped 'src'
Skipped 'src\conf'
A [work] src\conf\db.properties
Skipped 'src\java'
D:\workspace\trunk>svn cl ignore-on-commit src\conf\db.properties
D [work] src\conf\db.properties
A [ignore-on-commit] src\conf\db.properties
D:\workspace\trunk>svn status
--- Changelist 'work':
src\java\com\corp\sample\Main.java
M src\java\com\corp\sample\view\View.java
src\resource\icon.ico
--- Changelist 'ignore-on-commit':
M src\conf\db.properties
D:\workspace\trunk>svn commit --cl work -m "fixed refresh issue"
Sending src\java\com\corp\sample\view\View.java
Transmitting file data .done
Committing transaction...
Committed revision 9.
复制代码
参考: SVN: Is there a way to mark a file as “do not commit”?
我们本地提交代码的权限是被控制的,只能通过patch提交代码,因此结合设置的changelist可以这样打patch:svn diff --cl work > fixBug.patch
。
配置phpstorm
终端工具配置
在windows下,phpstorm默认使用的是cmd.exe
作为terminal工具。而cmd
是无法运行bash文件的,因此要将phpstorm的terminal工具换成Git Bash
。步骤如下:
在phpstorm中依次进入File-->Settings-->Tools-->Terminal
画出的红框中的路径一定要带双引号,不然运行要报错。
快捷工具配置
在phpstorm中,配置了必要的快捷工具可以提高自身工作效率。
例如我的一个项目不同的目录是从多个版本服务器中拉取的代码,我如果要更新某部分代码,则需要进入到很深的目录中才能执行svn up
。如果配置了快捷工具,我只需要使用快捷键Shift+Ctrl+A
就可以调出搜索框找到命令,然后回车运行命令即可,方便快捷。
具体的配置如下:
依次进入File-->Settings-->Tools-->External Tools
配置好命令和工作目录(命令会在此目录运行)。
快捷键配置
合理的配置快捷键可以提高工作效率。
我平时使用最多的是project
、Structure
、Version Control
、Terminal
、Debug
,因此重新将它们配置为更方便的'Alt+1/2/3/4/5'。
编写自动化脚本提高效率
一般情况下,在windows下获取带目录结构的补丁文件很麻烦。为了高效的解决这个问题,可以自己编写shell脚本来解决。例如如下脚本:
#! /bin/bash
# 文件名: doPatch
#文件用途: 打包补丁文件(包含目录结构)并上传到目标主机
echo '请输入起始COMMIT_ID'
read beginCommitId
echo '请输入结束COMMIT_ID(默认为HEAD)'
read endId
endCommitId=${endId:='HEAD'}
echo 'PATCH_NAME(默认为patch)'
read name
patchName=${name:='patch'}
echo 'HOST_IP'
read hostIp
createTime=`date "+%F-%H%M"`
patchPath='/home/hikwang/Downloads/tmp/patch/'
fileName=$patchName'_'$createTime'.zip'
zipFile=$patchPath$fileName
# 检查补丁目录是否存在
if [ ! -d "$patchPath" ];then
mkdir -p "$patchPath"
fi
if [[ $? -eq 0 ]];then
#git diff-tree -r --no-commit-id --name-only $commitId | xargs “C:\Program Files\7-Zip\7z” a $zipFile
git diff --name-only $beginCommitId $endCommitId | xargs “C:\Program Files\7-Zip\7z” a $zipFile
if [ $? -eq 0 ];then
echo '补丁创建成功:'$zipFile
if [[ $hostIp -ne null ]];then
scp $zipFile 'root@'$hostIp':/home/'
if [ $? -eq 0 ];then
echo '上传成功:/home/'$fileName
exit 0
else
echo '上传失败!'
exit 1
fi
else
exit 0
fi
else
echo "补丁创建失败";
exit 1
fi
fi
复制代码
在phpstorm的terminal
中运行以上脚本并在phpstorm的Version Control
中找到要用的commit_id
就可以打包出补丁文件。
但是shell脚本文件由于没法加入windows环境变量(shell脚本加入windows的环境变量也无法运行),使用时必须用脚本文件的绝对路径很不方便。
由于在Git Bash
下可以直接运行scp
等命令,所以我想只要将自定义命令放到和scp
命令同一个目录下,就可以在Git Bash
全局使用了。
找到scp
所在目录,我的是'L:\softwares\Git\usr\bin',将我的脚本文件’doPatch‘放到该目录。在Git Bash
直接运行doPatch
,能正常运行。