存档

‘Git版本管理工具’ 分类的存档

常用 Git 命令清单

2017年2月16日 评论已被关闭

常用 Git 命令清单

一般来说,日常使用只要记住下图6个命令,就可以了。但是熟练使用,恐怕要记住60~100个命令。

下面是我整理的常用 Git 命令清单。几个专用名词的译名如下。

Workspace:工作区

Index / Stage:暂存区

Repository:仓库区(或本地仓库)

Remote:远程仓库

一、新建代码库

# 在当前目录新建一个Git代码库

$ git init

# 新建一个目录,将其初始化为Git代码库

$ git init [project-name]

# 下载一个项目和它的整个代码历史

$ git clone [url]

二、配置

Git的设置文件为.gitconfig,它可以在用户主目录下(全局配置),也可以在项目目录下(项目配置)。

# 显示当前的Git配置

$ git config –list

# 编辑Git配置文件

$ git config -e [–global]

# 设置提交代码时的用户信息

$ git config [–global] user.name “[name]”

$ git config [–global] user.email “[email address]”

三、增加/删除文件

# 添加指定文件到暂存区

$ git add [file1] [file2] …

# 添加指定目录到暂存区,包括子目录

$ git add [dir]

# 添加当前目录的所有文件到暂存区

$ git add .

# 添加每个变化前,都会要求确认

# 对于同一个文件的多处变化,可以实现分次提交

$ git add -p

# 删除工作区文件,并且将这次删除放入暂存区

$ git rm [file1] [file2] …

# 停止追踪指定文件,但该文件会保留在工作区

$ git rm –cached [file]

# 改名文件,并且将这个改名放入暂存区

$ git mv [file-original] [file-renamed]

四、代码提交

# 提交暂存区到仓库区

$ git commit -m [message]

# 提交暂存区的指定文件到仓库区

$ git commit [file1] [file2] … -m [message]

# 提交工作区自上次commit之后的变化,直接到仓库区

$ git commit -a

# 提交时显示所有diff信息

$ git commit -v

# 使用一次新的commit,替代上一次提交# 如果代码没有任何新变化,则用来改写上一次commit的提交信息

$ git commit –amend -m [message]

# 重做上一次commit,并包括指定文件的新变化

$ git commit –amend [file1] [file2] …

五、分支

# 列出所有本地分支

$ git branch

# 列出所有远程分支

$ git branch -r

# 列出所有本地分支和远程分支

$ git branch -a

# 新建一个分支,但依然停留在当前分支

$ git branch [branch-name]

# 新建一个分支,并切换到该分支

$ git checkout -b [branch]

# 新建一个分支,指向指定commit

$ git branch [branch] [commit]

# 新建一个分支,与指定的远程分支建立追踪关系

$ git branch –track [branch] [remote-branch]

# 切换到指定分支,并更新工作区

$ git checkout [branch-name]

# 切换到上一个分支

$ git checkout –

# 建立追踪关系,在现有分支与指定的远程分支之间

$ git branch –set-upstream [branch] [remote-branch]

# 合并指定分支到当前分支

$ git merge [branch]

# 选择一个commit,合并进当前分支

$ git cherry-pick [commit]

# 删除分支

$ git branch -d [branch-name]

# 删除远程分支

$ git push origin –delete [branch-name]

$ git branch -dr [remote/branch]

六、标签

# 列出所有tag

$ git tag

# 新建一个tag在当前commit

$ git tag [tag]

# 新建一个tag在指定commit

$ git tag [tag] [commit]

# 删除本地tag

$ git tag -d [tag]

# 删除远程tag

$ git push origin :refs/tags/[tagName]

# 查看tag信息

$ git show [tag]

# 提交指定tag

$ git push [remote] [tag]

# 提交所有tag

$ git push [remote] –tags

# 新建一个分支,指向某个tag

$ git checkout -b [branch] [tag]

七、查看信息

# 显示有变更的文件

$ git status

# 显示当前分支的版本历史

$ git log

# 显示commit历史,以及每次commit发生变更的文件

$ git log –stat

# 搜索提交历史,根据关键词

$ git log -S [keyword]

# 显示某个commit之后的所有变动,每个commit占据一行

$ git log [tag] HEAD –pretty=format:%s

# 显示某个commit之后的所有变动,其”提交说明”必须符合搜索条件

$ git log [tag] HEAD –grep feature

# 显示某个文件的版本历史,包括文件改名

$ git log –follow [file]$ git whatchanged [file]

# 显示指定文件相关的每一次diff

$ git log -p [file]

# 显示过去5次提交

$ git log -5 –pretty –oneline

# 显示所有提交过的用户,按提交次数排序

$ git shortlog -sn

# 显示指定文件是什么人在什么时间修改过

$ git blame [file]

# 显示暂存区和工作区的差异

$ git diff

# 显示暂存区和上一个commit的差异

$ git diff –cached [file]

# 显示工作区与当前分支最新commit之间的差异

$ git diff HEAD

# 显示两次提交之间的差异

$ git diff [first-branch]…[second-branch]

# 显示今天你写了多少行代码

$ git diff –shortstat “@{0 day ago}”

# 显示某次提交的元数据和内容变化

$ git show [commit]

# 显示某次提交发生变化的文件

$ git show –name-only [commit]

# 显示某次提交时,某个文件的内容

$ git show [commit]:[filename]

# 显示当前分支的最近几次提交

$ git reflog

八、远程同步

# 下载远程仓库的所有变动

$ git fetch [remote]

# 显示所有远程仓库

$ git remote -v

# 显示某个远程仓库的信息

$ git remote show [remote]

# 增加一个新的远程仓库,并命名

$ git remote add [shortname] [url]

# 取回远程仓库的变化,并与本地分支合并

$ git pull [remote] [branch]

# 上传本地指定分支到远程仓库

$ git push [remote] [branch]

# 强行推送当前分支到远程仓库,即使有冲突

$ git push [remote] –force

# 推送所有分支到远程仓库

$ git push [remote] –all

九、撤销

# 恢复暂存区的指定文件到工作区

$ git checkout [file]

# 恢复某个commit的指定文件到暂存区和工作区

$ git checkout [commit] [file]

# 恢复暂存区的所有文件到工作区

$ git checkout .

# 重置暂存区的指定文件,与上一次commit保持一致,但工作区不变

$ git reset [file]

# 重置暂存区与工作区,与上一次commit保持一致

$ git reset –hard

# 重置当前分支的指针为指定commit,同时重置暂存区,但工作区不变

$ git reset [commit]

# 重置当前分支的HEAD为指定commit,同时重置暂存区和工作区,与指定commit一致

$ git reset –hard [commit]

# 重置当前HEAD为指定commit,但保持暂存区和工作区不变

$ git reset –keep [commit]

# 新建一个commit,用来撤销指定commit# 后者的所有变化都将被前者抵消,并且应用到当前分支

$ git revert [commit]

# 暂时将未提交的变化移除,稍后再移入

$ git stash

$ git stash pop

十、其他

# 生成一个可供发布的压缩包

$ git archive

分类: Git版本管理工具 标签:

安全防范:nginx下git引发的隐私泄露问题

2016年12月4日 评论已被关闭

安全防范:nginx下git引发的隐私泄露问题

http://www.cnblogs.com/beer/p/5589323.html
安全防范:nginx下git引发的隐私泄露问题
1 安全事件
最近阿里云服务器后台管理系统中收到一条安全提示消息,系统配置信息泄露:

http://my.domain.com/.git/config
能够被公网无认证即可访问,请修复。

一般情况下,配置信息泄露是相当严重的问题,往往会千万另外一个地方整片区域的 沦陷,比如:数据库。当然本例并没有这样,但是可以作为一个典型安全来进行讲解。

2 问题分析
由于目前的 web 项目的开发采用前后端完全分离的架构:前端全部使用静态文件,和后端代码完全分离,隶属两个不同的项目。表态文件使用 git 来进行同步发布到服务器,然后使用 nginx 指向到指定目录,以达到被公网访问的目的。

(pyvenv) ➜ web-app-front git:(master) ls -a
. .git .idea css fonts index.html tpl
.. .gitignore ReadMe.rst favicon.ico images js
将此项目发布到服务器的 /var/www/web-app-front 目录中,然后在Nginx中进行如下配置:

复制代码
# configuration of the server
server {
# the port your site will be served on
listen 80;
# the domain name it will serve for
server_name my.domain.com; # substitute your machine’s IP address or FQDN
charset utf-8;
# max upload size
client_max_body_size 75M; # adjust to taste

sendfile on;
keepalive_timeout 0;
location / {
alias /var/www/web-app-front/; # your webapp static
}

}
复制代码
以上配置,确实可以达到,只要访问 my.domain.com 的域,即可进入到 /var/www/web-app-front/ 目录,但是本目录下面有一些本来不想让外界访问到的文件也会被访问到,例如: .git 目录。

一般情况下,黑客可以通过常用的 路径 字典,轻松暴破到此路径及相应的文件。

3 可能危害
因为要使用持续集成系统,所以对于前端静态文件的发布也必须要使用自动化,使用自动化就必须避免交互式的密码输入。而git中避免使用交互式密码输入,主要有如下几种方法:

.netrc 保存明文账号和密码
在 url 中带明文账号和密码
使用 ssh-key 进行鉴权
当然,由于笔者使用的 ssh-key,所以并没有千万过多的隐私泄露,将危害控制到了最小(基本只泄露了这个仓库的名称信息,并没有危害)。

查看使用的 ssh-key 鉴权方式下的 .git/config 的内容:

复制代码
[core]
repositoryformatversion = 0
filemode = true
bare = false
logallrefupdates = true
[remote “origin”]
url = git@github.com:myteam/web-app-front.git
fetch = +refs/heads/*:refs/remotes/origin/*
[branch “master”]
remote = origin
merge = refs/heads/master
复制代码
但是,笔者不禁想起,以比较早期的时候,为了避免反复输入密码,曾经使用过在 url 中带明文账号和密码的方式来 clone 一个 git 仓库:

git clone https://username:password@github.com/myteam/web-app-front.git
即,把账号和密码放在url里面可以免去反复交互式输入账号密码的繁琐操作。这样的话 .git/config 就会包括如下内容了:

[remote “origin”]
url = https://username:password@github.com/myteam/web-app-front.git
显然,如上的疏忽就会导致如下内容被泄露:

账号名:username
密码:password
服务网站:github.com
项目组代号:myteam
项目仓库名称:web-app-front
然后黑客就可以轻松打开服务网站,使用指定的账号和密码登录。然后浏览开发人员所在组的所有代码,然后代码里面可能包含如下的内容:

数据库账号密码
服务器IP
服务器账号密码
其它隐私信息
将会完全被泄露出去,可以说,这样一个小疏忽会导致全线崩盘,这并不是耸人听闻。

4 处理方法
其实处理方法,最后仍然是这样一个思想:将权限最大化收拢,不过多外放任何不需要外放的权限。

由于本文是使用 nginx 来让外网具备访问文件目录的能力,所以此权限就在 nginx 层做配置,只需要将不需要被外界访问的目录进行排除设置即可。例如,不允许外部访问 .git 目录:

server {
location ~ /\.git {
deny all;
}
}
目录 .git 后是否带有”/”,带”/”只禁止访问目录,不带”/”禁止访问目录中的文件。

当然, nginx 还有更多的限制访问的配置,本文不再一一列举,读者有兴趣的可以查看其官网上的相关文档进行更细致的研究。

5 总结
对于服务器往往都放在公网云端的互联网从业人员来说,任何时候都不能对权限配置疏忽了,否则可能千万无法估量的损失。

git push错误;fatal: The remote end hung up unexpectedly

2016年12月4日 评论已被关闭

git push错误;fatal: The remote end hung up unexpectedly
http://blog.csdn.net/harry_helei/article/details/6997531

在ubuntu10.04终端上 执行以下命令:

[html] view plain copy
git clone git://XXX
XXX是源码路径,将git上的代码拷贝下来,然后分别执行:git commit和git push命令。执行git push之后,终端上直接输出一下错误:
[html] view plain copy
fatal: The remote end hung up unexpectedly
其它的没任何提示。
找google大神问了下,根据提示,大部分都是关于权限的问题,仔细检查了下,不存在这个问题。折腾了半天,后来经同事提醒,才知道原因是:Git clone git://xxx,这是一种只读方式来获取代码,无法进行git push。解决方法是用:git clone git@xxx,这是一种可以进行读和代码提交(git push)的方式获取源码,但需要进行密码确认。

GitHub push时提示“fatal: The remote end hung up unexpectedly”

2016年12月4日 评论已被关闭

GitHub push时提示“fatal: The remote end hung up unexpectedly”

http://www.cnblogs.com/Leon5/archive/2011/10/23/2222002.html

这几天在学习git的使用,顺便去网上找个了git代码仓库练练手。http://github.com

注册用户,建立项目什么的都很顺利。

然后网站提示如下:

首先,配置自己的git。

然后建立项目,添加文件,上传修改……

然后,喀……扯到蛋了。

上传时git提示:

Agent admitted failure to sign using the key. Permission denied (publickey)

fatal: The remote end hung up unexpectedly

查看github的官方文档

#1. Check for SSH keys.
$ cd ~/.ssh
#2. Backup and remove existing SSH keys.
$ lsLists all the subdirectories in the current directory
$ mkdir key_backupmakes a subdirectory called "key_backup" in the current directory
$ cp id_rsa* key_backupCopies the contents of the id_rsa directory into key_backup
$ rm id_rsa*
#3. Generate a new SSH key.
$ ssh-keygen -t rsa -C "your_email@youremail.com"
#4. Add your SSH key to GitHub.
#5. Test everything out.
$ ssh -T git@github.com

大概意思就是你现在本地建立自己的SSH密码对,然后将公钥上传到github就行了。

额,好复杂……按照提示折腾了一下,果然可以了。

分类: Git版本管理工具 标签:

关于git上传文件过大报错的问题 remote: warning: Large files detected.

2016年12月4日 评论已被关闭

关于git上传文件过大报错的问题 remote: warning: Large files detected.
http://blog.csdn.net/memray/article/details/43154779
今天往git上传了个项目,没有注意有个500m的大家伙在里面,就一并commit+push了,然后噩梦就来了。
首先是报错:

remote: warning: Large files detected.
# remote: warning: File big_file is 55.00 MB; this is larger than GitHub’s recommended maximum file size of 50 MB

一看不就是文件过大报错了嘛,直接文件delete重新commit,没想到问题继续。。
然后又尝试重试新建一个小的同名文件继续commit,问题继续。。

后来找到github上的一个帮助页面 Working with large files,照着”Removing the local file added with the most recent unpushed commit”的步骤操作了一番,最终未遂。但我的问题应该是下面的关于“Removing the file added in an older commit”才能解决的(因为我已经提交并push了),可是教程里只写了通过git-filter-branch解决,但是命令不能用~

想到我的问题一定是这个大文件已经保存到了log中,因此无论我怎么删改,这个文件没有从log中剔除就总会报出相同的错误,最后又是在万能的StackOverflow上有人给出了解决方法,命令如下:

[plain] view plain copy 在CODE上查看代码片派生到我的代码片
git filter-branch -f –index-filter “git rm -rf –cached –ignore-unmatch FOLDERNAME” — –all
把你的文件或者文件夹位置替换掉那个FOLDERNAME就可以了,T_T 我再也不乱放大文件了。

分类: Git版本管理工具 标签:

fatal: the remote end hung up unexpectedly

2016年12月4日 评论已被关闭

fatal: the remote end hung up unexpectedly
http://blog.sina.com.cn/s/blog_71d4414d0100wfwq.html
发生在push命令中,有可能是push的文件过大导致
解决方法:
windows:
在 .git/config 文件中加入
[http]
postBuffer = 524288000

linux:
git config http.postBuffer 524288000

gitlab使用过程中遇到大文件上传或下载失败的问题,总结一下

2016年12月4日 评论已被关闭

gitlab使用过程中遇到大文件上传或下载失败的问题,总结一下
https://my.oschina.net/sayonala/blog/294197
摘要: 平时代码使用gitlab维护,为了方便使用http方式进行代码的上传及下载,遇到文件过大上传失败提示httpcode 411和413的问题,还有就是比较大的二进制文件下载提示httpcode 502的问题,特将解决方法进行记录,以备参考。
环境如下:gitlab服务器redhat,客户端环境mac os,如果是其他环境遇到问题仅供参考

如果gitlab上传代码提示:

error: RPC failed; result=22, HTTP code = 411

该问题是由于客户端设置的http_post_buffer大小不足导致的,解决方法如下:

进入到工程所在的终端目录下执行:

git config http.postBuffer 524288000

如果gitlab上传代码提示:

error: RPC failed; result=22, HTTP code = 413

该问题是由于gitlab服务器端client_max_body_size参数过小大致的,解决方法如下:

进入到服务器的终端目录:/etc/nginx下,编辑nginx.conf,在http配置段中增加如下配置

client_max_body_size 500m #大小自行调节

如果gitlab clone代码提示:

error: RPC failed; result=22, HTTP code = 502

该问题一般都是由于gitlab服务器端上的文件过大,导致客户端下载文件超时,gitlab使用unicorn进行webserver管理,如果客户端下载文件超过30s,unicorn就会结束该线程,因此这里的解决方案就是设置unicorn的超时时间,方法如下:

进入到gitlab服务器的终端目录:/home/git/gitlab/config/下,编辑unicorn.rb
# nuke workers after 30 seconds instead of 60 seconds (the default)
timeout 120
调整该项时间值,即可调整超时时间,具体设置自行调节

分类: Git版本管理工具 标签:

【git】fatal: This operation must be run in a work tree

2016年11月22日 评论已被关闭

【git】fatal: This operation must be run in a work tree
【git】fatal: This operation must be run in a work tree
2014-03-16 20:49 9877人阅读 评论(0) 收藏 举报
分类: linux菜鸟手记(185)
版权声明:本文为博主原创文章,未经博主允许不得转载。
之前是这么弄的 http://blog.csdn.net/commshare/article/details/20526369 ,感觉思路还是不太清晰。

今天新建立一个工程,需要一个仓库。
用Git –bare init创建的empty的仓库,不能git add,

会会报错fatal: This operation must be run in a work tree 。

但是,据说用git init的可以。
http://blog.csdn.net/commshare/article/details/21337313

解决办法有几个,
参考 http://blog.sina.com.cn/s/blog_630bf12f0100nl7i.html
参考 http://stackoverflow.com/questions/1456923/why-am-i-getting-the-message-fatal-this-operation-must-be-run-in-a-work-tree

===============

我选用的是:

仓库用git –bare init,

而我的实际的工程目录下用git init,git remote add origin ,git add 某个文件,git commit ,git push之后,

远程的仓库就ok了。

用gitweb也可以顺利的看到。

之前是这么弄的 http://blog.csdn.net/commshare/article/details/20526369 ,感觉思路还是不太清晰。

今天新建立一个工程,需要一个仓库。
用Git –bare init创建的empty的仓库,不能git add,

会会报错fatal: This operation must be run in a work tree 。

但是,据说用git init的可以。
http://blog.csdn.net/commshare/article/details/21337313

解决办法有几个,
参考 http://blog.sina.com.cn/s/blog_630bf12f0100nl7i.html
参考 http://stackoverflow.com/questions/1456923/why-am-i-getting-the-message-fatal-this-operation-must-be-run-in-a-work-tree

===============

我选用的是:

仓库用git –bare init,

而我的实际的工程目录下用git init,git remote add origin ,git add 某个文件,git commit ,git push之后,

远程的仓库就ok了。

用gitweb也可以顺利的看到。

分类: Git版本管理工具 标签:

error: src refspec master does not match any. 错误处理办法

2016年11月21日 评论已被关闭

error: src refspec master does not match any. 错误处理办法

http://www.cnblogs.com/jeremylee/p/5715289.html
本地仓库使用如下命令初始化:

$ git init
之后使用如下命令添加远程库:

$ git remote add origin git@github.com:hahah/ftpmanage.git
然后使用

$ git push -u origin master
出现如下错误:

error: src refspec master does not match any.
error: failed to push some refs to ‘git@github.com:hahaha/ftpmanage.git’
原因:

本地仓库为空

解决方法:使用如下命令 添加文件;

$ git add add.php addok.php conn.php del.php edit.php editok.php ftpsql.sql index.php

$ git commit -m “init files”
之后在push过程中出现如下错误:

复制代码
$ git push -u origin master
Warning: Permanently added the RSA host key for IP address ‘xx.xx.xxx.xxx’ to the list of known hosts.
To git@github.com:hahaha/ftpmanage.git
! [rejected] master -> master (fetch first)
error: failed to push some refs to ‘git@github.com:hahahah/ftpmanage.git’
hint: Updates were rejected because the remote contains work that you do
hint: not have locally. This is usually caused by another repository pushing
hint: to the same ref. You may want to first integrate the remote changes
hint: (e.g., ‘git pull …’) before pushing again.
hint: See the ‘Note about fast-forwards’ in ‘git push –help’ for details.
复制代码
提示使用 git pull 之后在 push

使用如下命令解决:

复制代码
$ git pull –rebase origin master
warning: no common commits
remote: Counting objects: 3, done.
remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (3/3), done.
From github.com:hahah/ftpmanage
* branch master -> FETCH_HEAD
* [new branch] master -> origin/master
First, rewinding head to replay your work on top of it…
Applying: init files
复制代码
继续push,成功。

复制代码
$ git push -u origin master
Counting objects: 10, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (10/10), done.
Writing objects: 100% (10/10), 5.15 KiB | 0 bytes/s, done.
Total 10 (delta 3), reused 0 (delta 0)
To git@github.com:hahaha/ftpmanage.git
a2b5c30..1044f15 master -> master
Branch master set up to track remote branch master from origin.
复制代码
大功告成!!!

分类: Git版本管理工具 标签:

如何设置Subversion使用的端口

2016年11月2日 评论已被关闭

 

如何设置Subversion使用的端口
http://blog.csdn.net/jinbiao520/article/details/8254217
Subversion有两种不同的配置方式,一种基于它自带的轻量级服务器svnserve,一种基于非常流行的Web服务器Apache。

根据不同的配置方式,Subversion使用不同的端口对外提供服务。

基于svnserve的,默认端口为3690,

基于Apache的,默认端口为Apache的默认端口80。

有时候,我们会因为防火墙或其它原因,需要修改这些默认端口。

下面根据不同的配置讲讲如何改变这些默认端口。

1、通过svnserve -d -r d:\svn来提供服务 (假设d:\svn为你的版本库所在目录)

为svnserve 加上–listen-port参数,比如svnserve -d -r d:\svn –listen-port 81

2、通过Apache来提供服务

在httpd.conf中,查找Listen 80,将80修改为你想要的端口

linux筹建Subversion服务器+修改svn端口号

2016年11月2日 评论已被关闭

linux筹建Subversion服务器+修改svn端口号

http://www.myexception.cn/cvs-svn/922781.html

linux搭建Subversion服务器+修改svn端口号[转]

 

linux搭建Subversion服务器+修改svn端口号[转]

1、首先需要安装 subversion 这个软件。

2、在 /home/nicky 下建立一个 repo,名称为 svnproject。

3、然后把 /fun/theme 目录下的内容导入到这个 repo 中。

4、最后给这个 repo 建立一个 svn 自带的 svnserve。

svn要使用非默认端口,可以在svnserve后面加一个 –listen-port 21 来修改svn使用的端口号,

操作如下:在命令提示符下输入:

svnserve -d -r –listen-port 21

注:红色加粗部分为SVN根目录

同时,,比如在declan目录下还建有另一个项目,名为 svntest,那么可以启动

svnserve -d -r –listen-port 3690

则svntest项目监听3690(svn默认)端口号,这样在使用 netstat -ntlp 进程查看时会查看到另个svnserver,而在客户端,默认连接为3690端口,也可以在地址后加 “:21”,即 冒号+端口号 来设定访问端口。

以上命令要到svn安装目录下 bin/下使用。

 

 

 

6、查看进程使用端口号及结束进程

使用命令 sudo netstat -ntlp,可以查看到目前系统网络服务器的运行情况,然后使用 sudo kill -9 pid,结束进程。

如何设置Subversion使用的端口

2016年10月31日 评论已被关闭

如何设置Subversion使用的端口

Subversion有两种不同的配置方式,一种基于它自带的轻量级服务器svnserve,一种基于非常流行的Web服务器Apache。

根据不同的配置方式,Subversion使用不同的端口对外提供服务。

基于svnserve的,默认端口为3690,

基于Apache的,默认端口为Apache的默认端口80。

有时候,我们会因为防火墙或其它原因,需要修改这些默认端口。

下面根据不同的配置讲讲如何改变这些默认端口。

1、通过svnserve -d -r d:\svn来提供服务 (假设d:\svn为你的版本库所在目录)

为svnserve 加上–listen-port参数,比如svnserve -d -r d:\svn –listen-port 81

2、通过Apache来提供服务

在httpd.conf中,查找Listen 80,将80修改为你想要的端口

 

技术指导:Subversion端口设置妙招

2016年10月31日 评论已被关闭

技术指导:Subversion端口设置妙招
http://developer.51cto.com/art/201005/200400.htm
本文简单介绍一下Subversion端口设置问题,希望对为此问题苦恼的朋友们能有所帮助吧,欢迎大家一起来学习。
AD:51CTO 网+ 第十二期沙龙:大话数据之美_如何用数据驱动用户体验
学习Subversion时,你可能会遇到Subversion端口设置问题,这里将介绍Subversion端口设置问题的解决方法,在这里拿出来和大家分享一下。

如何设置Subversion使用的端口2009-12-1711:20Subversion有两种不同的配置方式,一种基于它自带的轻量级服务器svnserve,一种基于非常流行的Web服务器Apache。根据不同的配置方式,Subversion使用不同的端口对外提供服务。

基于svnserve的,默认端口为3690,基于Apache的,默认端口为Apache的默认端口80。有时候,我们会因为防火墙或其它原因,需要修改这些默认端口。下面根据不同的配置讲讲如何改变这些默认端口。

1、通过svnserve-d-rd:\svn来提供服务(假设d:\svn为你的版本库所在目录)为svnserve加上–listen-port参数,比如svnserve-d-rd:\svn–listen-port81。

2、通过Apache来提供服务

在httpd.conf中,查找Listen80,将80修改为你想要的Subversion端口。

转载请注明来自SVN知识库http://wiki.iusesvn.com

后记:

如果在内网架设的SVN服务器想让外网访问,又没有外网固定IP的话,可以通过绑定花生壳搞定。在路由器上appcation&gaming-》PortRangeForwarding中设置Subversion端口映射3690。这样,通过花生壳绑定的域名svn://域名就可以在外网使用SVN了。如果你的路由已经有固定IP,可以省略花生壳绑定,在路由上添加端口映射后,直接svn:您的固定IP就可以在外网使用SVN。

初步使用Git托管服务器github

2016年10月28日 评论已被关闭

初步使用Git托管服务器github
http://blog.chinaunix.net/xmlrpc.php?r=blog/article&uid=20078486&id=3853274
1、首先当然是到github.com注册用户:用户名、邮箱、密码
2、完成之后,create a new repo
名称: ci
选择: Private
选择新建一个README文件来初始化repository
3、回到本机git bash,进入本地项目根目录
4、查看自己git客户端的配置 git config –list
user.email=邮箱地址使用注册github用户时使用的邮箱地址
5、添加远程github仓库
git remote add 别名 https://github.com/用户名/项目名称.git
其中别名自己取一个,用户名就是第1步注册时的用户名,项目名称就是第2步建项目的名称
例如我的就是: git remote add ci_github https://github.com/blanker/ci.git
6、合并 git pull ci_github master
7、推送 git push ci_github master
————————————————————
至此大功告成,期间需要输入github的用户名和密码来验证

分类: Git版本管理工具 标签:

自己动手搭建Git服务器-Gitblit

2016年10月28日 评论已被关闭

自己动手搭建Git服务器-Gitblit

http://blog.chinaunix.net/xmlrpc.php?r=blog/article&uid=20078486&id=3864573

首先到官网http://gitblit.com/
下载最新版本的Gitblit GO

解压缩到本地目录中 E:\git\gitblit132

官方文档:http://gitblit.com/setup_go.html
开始配置

一、 服务器配置

打开配置文件 data/gitblit.properties

  • server.httpPort = 7070 
  • server.httpsPort = 0
注意: server.httpBindInterface = localhost  修改成 server.httpBindInterface =
把localhost删除,否则,局域网能其他电脑没法通过http://ip-address:7070 访问

运行 gitblit.cmd ,启动服务

注意:
可以通过运行installService/uninstallService把服务器安装到windows系统服务中,且自动启动
不过需要注意的是,在运行这两个bat文件之前,需要修改其中的set ARCH=x86这一行修改为自己操作系统对应的位数
安装完之后的服务名叫做gitblit,以后就可以通过gitblitw来管理了,像tomcat,apache一样

访问 http://localhost:7070/

用admin/admin登录,居然是中文版界面,很好很强大!

在用户管理界面,可以把admin的密码修改掉

新建用户blankerer/123456

接下来新建一个仓库,名称叫做 ci
所有者授权给用户blankerer
授权控制选择“授予所有认证用户受限制的访问权限”

一、 客户端配置

回到客户端,添加远程仓库
git remote add ci_gitblit http://localhost:7070/git/ci.git
( 如果不想每次推送输入用户名和密码,可以在添加时指定:
git remote add ci_gitblit http://blankerer:123456@localhost:7070/git/ci.git
)

看看效果:
git remote show ci_gitblit

push本地代码:
git push ci_gitblit master

然后再看看效果:
git remote show ci_gitblit

至此大功告成

分类: Git版本管理工具 标签:

svn: xxx/ is already a working copy for a different url 解决办法

2016年10月27日 评论已被关闭

svn: xxx/ is already a working copy for a different url 解决办法

http://blog.csdn.net/dongqinliuzi/article/details/39299223

运行更新脚本的时候出现如题的错误,小编经过亲自检测查找资料后找到了解决方案。
首先说明下原因:
出现这种情况大多是由于原有的目录是使用svn更新的,并且指定了一个更新的url,比如说
http://192.168.10.1/svn/xxx,如果此url由于某种原因无法使用,而换成了http://192.168.10.2/svn/xxx,那么要实现从第二个
url取出文件,仅仅将用于更新的shell脚本中的url替换成最新的是不够的,马上就会出现标题中的提示,解决办法如下:
1.保留工程目录,将此目录下的所有文件清空(主要是原有的svn文件的干扰) 如:
$ sudo rm -rf xxx/*
2.运行更新脚本,将工程从svn中取出到该目录。 如:
$ sudo svn co svn://localhost/svn

分类: Git版本管理工具 标签:

SVN安装配置及安全注意事项

2016年10月25日 评论已被关闭

SVN安装配置及安全注意事项

http://www.2cto.com/Article/201308/232579.html
0x00 SVN介绍

Subversion,简称SVN,是一个开放源代码的版本控制系统,相对于的RCS、CVS,采用了分支管理系统,它的设计目标就是取代CVS。互联网上越来越多的控制服务从CVS转移到Subversion。

Subversion的官方网站是:http://subversion.tigris.org/

中文的网站:Subversion中文站、SVNBook 正體中文版、Subversion中文社区、中文SVN技术资料

这些网站都提供了非常详细、多样的说明文档,有时间大家可以逐一细查。

Subversion使用服务端—客户端的结构,当然服务端与客户端可以都运行在同一台服务器上。在服务端是存放着所有受控制数据的Subversion仓库,另一端是Subversion的客户端程序,管理着受控数据的一部分在本地的映射(称为“工作副本”)。在这两端之间,是通过各种仓库存取层(Repository Access,简称RA)的多条通道进行访问的。这些通道中,可以通过不同的网络协议,例如HTTP、SSH等,或本地文件的方式来对仓库进行操作。

0x01 安装配置
安装SVN

#yum install subversion
测试是否安装成功

#svnserve –version
如果显示了版本信息则表示安装成功

创建仓库

#svnadmin create /home/svn/repo
给svn设置密码

修改配置文件/home/svn/repo/conf/svnserve.conf
去掉

#[general]
前面的#号

匿名访问的权限,可以是read,write,none,默认为read

anon-access = none
认证用户的权限,可以是read,write,none,默认为write

auth-access = write
密码数据库的路径

#password-db = passwd
去掉前面的#

修改配置文件passwd

#vim /home/svn/repo/conf/passwd
=前面是用户名,后面是密码:

[users]
name = password
启动SVN服务器

对于单个代码仓库

#svnserve -d -r /home/svn –listen-host 192.168.1.100
svn默认端口是3690,在防火墙上开放这个端口。

/sbin/iptables -A INPUT -i eth0 -p tcp –dport 3690 -j ACCEPT
/sbin/service iptables save
把/var/www/html/目录导入到svn的repo目录下

svn import /var/www/html/ file:///home/svn/repo -m “test”

0x02 注意的问题

1、检出(导出结果带.svn文件夹的目录树)

svn co http://路径 [本地目录全路径] –username 用户名 –password 密码
svn co svn://路径 [本地目录全路径] –username 用户名 –password 密码
svn checkout http://路径 [本地目录全路径] –username 用户名
svn checkout svn://路径 [本地目录全路径] –username 用户名
如果不带–password 参数传输密码的话,会提示输入密码,建议不要用明文的–password 选项。
其中 username 与 password前是两个短线,不是一个。
不指定本地目录全路径,则检出到当前目录下。

2、导出(导出一个干净的不带.svn文件夹的目录树)

svn export [-r 版本号] http://路径 [本地目录全路径] –username 用户名
svn export [-r 版本号] svn://路径 [本地目录全路径] –username 用户名
svn export 本地检出的(即带有.svn文件夹的)目录全路径 要导出的本地目录全路径
第一种从版本库导出干净工作目录树的形式是指定URL。
如果指定了修订版本号,会导出相应的版本。
如果没有指定修订版本,则会导出最新的,导出到指定位置。
如果省略 本地目录全路径,URL的最后一部分会作为本地目录的名字。
第二种形式是指定 本地检出的目录全路径 到 要导出的本地目录全路径,所有的本地修改将会保留。
但是不在版本控制下(即没提交的新文件,因为.svn文件夹里没有与之相关的信息记录)的文件不会拷贝。

现实的开发环境中,强烈建议使用导出功能svn export而不是svn co。

由此可能导致非常严重的问题,很多管理员直接吧svn co出来的代码直接放到web目录下。

这就使.svn隐藏文件夹被暴露于外网环境,黑客可以借助其中包含的用于版本信息追踪的“entries”文件,逐步摸清站点结构。

svn及entries文件夹暴露于外网环境
svn及entries文件夹暴露于外网环境
更严重的问题在于,SVN产生的.svn目录下还包含了以.svn-base结尾的源代码文件副本(低版本SVN具体路径为text-base目录,高版本SVN为pristine目录),如果服务器没有对此类后缀做解析,黑客则可以直接获得文件源代码。

源代码文件副本暴露于外网环境
源代码文件副本暴露于外网环境
如果解析了该后缀,可能会有文件解析的漏洞,可能会有扩展解析漏洞,找地方上传xxx.php.gif也许就可以直接得到webshell了。

如果已经线上的生产环境已经有了.svn目录不想删掉可以在服务器上设置禁制访问此目录:

另外svn更新至1.7+ .svn/entries目录就不包含文件目录列表了。

Apache:

<Directory ~ “\.svn”>
Order allow,deny
Deny from all
</Directory>
Nginx:

location ~ ^(.*)\/\.svn\/ {
return 404;
}
附上个遍历.svn/entries展现网站目录结构的两个脚本:
http://up.2cto.com/2013/0801/20130801103823514.zip

参考:

Subversion快速入门教程:/os/201308/232571.html

用Apache和Subversion搭建安全的版本控制环境 :/Article/201308/232575.html

centos svn安装及配置与使用:/os/201308/232576.html

linux下svn常用指令:/os/201308/232577.html

WooYun: .svn目录未设权限限制的漏洞利用总结:/Article/201203/124841.html

分类: Git版本管理工具 标签:

SVN命令的使用和功能详解

2016年10月25日 评论已被关闭

SVN命令的使用和功能详解
http://www.2cto.com/kf/201605/508868.html
命令的使用
1、检出

svn
cohttp://路径(目录或文件的全路径) [本地目录全路径]
–username 用户名 –password 密码svncosvn://路径(目录或文件的全路径) [本地目录全路径] –username用户名 –password 密码
svn checkouthttp://路径(目录或文件的全路径) [本地目录全路径] –username 用户名
svn checkoutsvn://路径(目录或文件的全路径) [本地目录全路径]–username 用户名
注:如果不带–password 参数传输密码的话,会提示输入密码,建议不要用明文的–password 选项。
其中 username 与 password前是两个短线,不是一个。
不指定本地目录全路径,则检出到当前目录下。
例子:
svn cosvn://localhost/测试工具 /home/testtools –username wzhnsc
svn co http://localhost/test/testapp–username wzhnsc
svn checkout svn://localhost/测试工具/home/testtools –username wzhnsc
svn checkouthttp://localhost/test/testapp –username wzhnsc

2、导出(导出一个干净的不带.svn文件夹的目录树)
svnexport [-r 版本号]http://路径(目录或文件的全路径) [本地目录全路径] –username 用户名
svnexport [-r 版本号]svn://路径(目录或文件的全路径) [本地目录全路径] –username 用户名
svnexport本地检出的(即带有.svn文件夹的)目录全路径要导出的本地目录全路径
注:第一种从版本库导出干净工作目录树的形式是指定URL,
如果指定了修订版本号,会导出相应的版本,
如果没有指定修订版本,则会导出最新的,导出到指定位置。
如果省略 本地目录全路径,URL的最后一部分会作为本地目录的名字。
第二种形式是指定 本地检出的目录全路径 到要导出的本地目录全路径,所有的本地修改将会保留,
但是不在版本控制下(即没提交的新文件,因为.svn文件夹里没有与之相关的信息记录)的文件不会拷贝。
例子:
svn exportsvn://localhost/测试工具 /home/testtools –username wzhnsc
svn exportsvn://localhost/test/testapp–username wzhnsc
svn export/home/testapp /home/testtools

3、添加新文件
svn add 文件名
注:告诉SVN服务器要添加文件了,还要用svn commint -m真实的上传上去!
例子:
svn add test.php <- 添加test.php
svn commit -m “添加我的测试用test.php“test.php
svn add *.php <- 添加当前目录下所有的php文件
svn commit -m “添加我的测试用全部php文件“*.php

4、提交
svn commit -m “提交备注信息文本“ [-N] [–no-unlock] 文件名
svn ci -m “提交备注信息文本“ [-N] [–no-unlock] 文件名
必须带上-m参数,参数可以为空,但是必须写上-m
例子:
svn commit -m “提交当前目录下的全部在版本控制下的文件“ *<- 注意这个*表示全部文件
svn commit -m “提交我的测试用test.php“test.php
svn commit -m “提交我的测试用test.php“-N –no-unlock test.php <- 保持锁就用–no-unlock开关
svn ci -m “提交当前目录下的全部在版本控制下的文件“ *<- 注意这个*表示全部文件
svn ci -m “提交我的测试用test.php“test.php
svn ci -m “提交我的测试用test.php“-N –no-unlock test.php <- 保持锁就用–no-unlock开关

5、更新文件
svn update
svn update -r 修正版本 文件名
svn update 文件名
例子:
svn update <-后面没有目录,默认将当前目录以及子目录下的所有文件都更新到最新版本
svn update -r 200test.cpp <- 将版本库中的文件 test.cpp还原到修正版本(revision)200
svnupdate test.php <- 更新与版本库同步。
提交的时候提示过期冲突,需要先 update 修改文件,
然后清除svn resolved,最后再提交commit。

6、删除文件
svn delete svn://路径(目录或文件的全路径) -m “删除备注信息文本”
推荐如下操作:
svn delete 文件名
svn ci -m “删除备注信息文本”
例子:
svn deletesvn://localhost/testapp/test.php -m “删除测试文件test.php”
推荐如下操作:
svn deletetest.php
svn ci -m “删除测试文件test.php”

7、加锁/解锁
svn lock -m “加锁备注信息文本“ [–force] 文件名
svn unlock 文件名
例子:
svn lock -m “锁信测试用test.php文件“test.php
svn unlock test.php

8、比较差异
svn diff 文件名
svn diff -r 修正版本号m:修正版本号n 文件名
例子:
svn diff test.php<- 将修改的文件与基础版本比较
svn diff -r 200:201 test.php<- 对修正版本号200 和 修正版本号201 比较差异

9、查看文件或者目录状态
svn st目录路径/名
svn status 目录路径/名<-目录下的文件和子目录的状态,正常状态不显示
【?:不在svn的控制中;M:内容被修改;C:发生冲突;
A:预定加入到版本库;K:被锁定】
svn -v 目录路径/名
svn status -v 目录路径/名<-显示文件和子目录状态
【第一列保持相同,第二列显示工作版本号,
第三和第四列显示最后一次修改的版本号和修改人】
注:svn status、svn diff和 svn revert这三条命令在没有网络的情况下也可以执行的,
原因是svn在本地的.svn中保留了本地版本的原始拷贝。

10、查看日志
svn log 文件名
例子:
svn log test.php<-显示这个文件的所有修改记录,及其版本号的变化

11、查看文件详细信息
svn info 文件名
例子:
svn info test.php

12、SVN 帮助
svn help <- 全部功能选项
svn help ci <- 具体功能的说明

13、查看版本库下的文件和目录列表
svn list svn://路径(目录或文件的全路径)
svn ls svn://路径(目录或文件的全路径)
例子:
svn list svn://localhost/test
svn ls svn://localhost/test<- 显示svn://localhost/test目录下的所有属于版本库的文件和目录

14、创建纳入版本控制下的新目录
svn mkdir 目录名
svn mkdir -m ”新增目录备注文本” http://目录全路径
例子:
svn mkdir newdir
svn mkdir -m “Making a new dir.”svn://localhost/test/newdir
注:添加完子目录后,一定要回到根目录更新一下,不然在该目录下提交文件会提示“提交失败”
svn update
注:如果手工在checkout出来的目录里创建了一个新文件夹newsubdir,
再用svn mkdirnewsubdir命令后,SVN会提示:
svn: 尝试用 “svn add”或 “svn add –non-recursive”代替?
svn: 无法创建目录“hello”: 文件已经存在
此时,用如下命令解决:
svn add –non-recursivenewsubdir
在进入这个newsubdir文件夹,用ls -a查看它下面的全部目录与文件,会发现多了:.svn目录
再用 svn mkdir -m “添hello功能模块文件”svn://localhost/test/newdir/newsubdir 命令,
SVN提示:
svn: File already exists: filesystem ‘/data/svnroot/test/db’,transaction ‘4541-1’,
path ‘/newdir/newsubdir ‘

15、恢复本地修改
svn revert [–recursive] 文件名
注意: 本子命令不会存取网络,并且会解除冲突的状况。但是它不会恢复被删除的目录。
例子:
svn revert foo.c <- 丢弃对一个文件的修改
svn revert –recursive . <-恢复一整个目录的文件,.为当前目录

16、把工作拷贝更新到别的URL
svn switch http://目录全路径 本地目录全路径
例子:
svn switch http://localhost/test/456 .<-(原为123的分支)当前所在目录分支到localhost/test/456

17、解决冲突
svn resolved [本地目录全路径]
例子:
$ svn update
C foo.c
Updated to revision 31.
如果你在更新时得到冲突,你的工作拷贝会产生三个新的文件:
$ ls
foo.c
foo.c.mine
foo.c.r30
foo.c.r31
当你解决了foo.c的冲突,并且准备提交,运行svn resolved让你的工作拷贝知道你已经完成了所有事情。
你可以仅仅删除冲突的文件并且提交,但是svnresolved除了删除冲突文件,还修正了一些记录在工作拷贝管理区域的记录数据,所以我们推荐你使用这个命令。

18、不checkout而查看输出特定文件或URL的内容
svn cat http://文件全路径
例子:
svn cathttp://localhost/test/readme.txt

19、新建一个分支copy

svn copy branchAbranchB -m “make B branch” //从branchA拷贝出一个新分支branchB
20、合并内容到分支merge

svn merge branchAbranchB // 把对branchA的修改合并到分支branchB

SVN功能详解

TortoiseSVN是windows下其中一个非常优秀的SVN客户端工具。通过使用它,我们可以可视化的管理我们的版本库。不过由于它只是一个客户端,所以它不能对版本库进行权限管理。

TortoiseSVN不是一个独立的窗口程序,而是集成在windows右键菜单中,使用起来比较方便。
TortoiseSVN每个菜单项都表示什么意思
01、SVN Checkout(SVN取出)
点击SVN Checkout,弹出检出提示框,在URL of repository输入框中输入服务器仓库地址,在Checkout directory输入框中输入本地工作拷贝的路径,点击确定,即可检出服务器上的配置库。

02、SVN Update(SVN更新)
如果配置库在本地已有工作拷贝,则取得最新版本只是执行SVN Update即可,点击SVN Update,系统弹出更新提示框,点击确定,则把服务器是最新版本更新下来

03、Import(导入)
选择要提交到服务器的目录,右键选择TortoiseSVN—-Import,系统弹出导入提示框,在URL of repository输入框中输入服务器仓库地址,在Import Message输入框中输入导入日志信息,点击确定,则文件导入到服务器仓库中。

04、Add(加入)
如果有多个文件及文件夹要提交到服务器,我们可以先把这些要提交的文件加入到提交列表中,要执行提交操作,一次性把所有文件提交,如图,可以选择要提交的文件,然后点击执行提交(SVN Commit),即可把所有文件一次性提交到服务器上

05、Resolving Conflicts(解决冲突)
有时你从档案库更新文件会有冲突。冲突产生于两人都修改文件的某一部分。解决冲突只能靠人而不是机器。当产生冲突时,你应该打开冲突的文件,查找以<<<<<<<开始的行。冲突部分被标记:
<<<<<<< filename
your changes
=======
code merged from repository
>>>>>>> revision
Subversion为每个冲突文件产生三个附加文件:
filename.ext.mine
更新前的本地文件。
filename.ext.rOLDREV
你作改动的基础版本。
filename.ext.rNEWREV
更新时从档案库得到的最新版本。
使用快捷菜单的编辑冲突Edit Conflict命令来解决冲突。然后从快捷菜单中执行已解决Resolved命令,将改动送交到档案库。请注意,解决命令并不解决冲突,而仅仅是删除filename.ext.mineandfilename.ext.r*文件并允许你送交。

06、Check for Modifications(检查更新)
点击Check for Modifications,系统列表所以待更新的文件及文件夹的状态.
07、Revision Graph(版本分支图)
查看文件的分支,版本结构,可以点击Revision Graph,系统以图形化形式显示版本分支.

08、Rename(改名)
SVN支持文件改名,点击Rename,弹出文件名称输入框,输入新的文件名称,点击确定,再把修改提交,即可完成文件改名

09、Delete(删除)
SVN支持文件删除,而且操作简单,方便,选择要删除的文件,点击Delete,再把删除操作提交到服务器

10、Moving(移动)
选择待移动的文件和文件夹;按住右键拖动right-drag文件(夹)到跟踪拷贝内的新地方;松开左键;在弹出菜单中选择move files in Subversion to here

11、Revert(还原)
还原操作,如刚才对文件做了删除操作,现在把它还原回来,点击删除后,再点击提交,会出现如上的提示框,点击删除后,再点击Revert,即已撤销删除操作,如果这时候点击提交,则系统弹出提示框:没有文件被修改或增加,不能提交

12、Branch/Tag(分支/标记)
当需要创建分支,点击Branch/Tag,在弹出的提示框中,输入分支文件名,输入日志信息,点击确定,分支创建成功,然后可查看文件的版本分支情况

13、Switch(切换)
文件创建分支后,你可以选择在主干工作,还是在分支工作,这时候你可以通过Switch来切换。

14、Merge(合并)
主干和分支的版本进行合并,在源和目的各输入文件的路径,版本号,点击确定。系统即对文件进行合并,如果存在冲突,请参考冲突解决。

15、Export(导出)
把整个工作拷贝导出到本地目录下,导出的文件将不带svn文件标志,文件及文件夹没有绿色的”√”符号标志。

16、Relocate(重新定位)
当服务器上的文件库目录已经改变,我们可以把工作拷贝重新定位,在To URL输入框中输入新的地址

17、Add to Ignore List(添加到忽略列表)
大多数项目会有一些文件(夹)不需要版本控制,如编译产生的*.obj, *.lst,等。每次送交,TortoiseSVN提示那些文件不需要控制,挺烦的。这时候可以把这些文件加入忽略列表。

18、SVN其它相关功能
客户端修改用户密码:
打开浏览器,在地址栏内输入http://192.168.1.250/cgi-bin/ChangePasswd,启动客户端修改用户密码的界面,输入正确的用户名,旧密码,新密码(注意密码的位数应该不小于6,尽量使用安全的密码),点击修改即可.

19、SVN Commit(版本提交)
把自己工作拷贝所做的修改提交到版本库中,这样别人在获取最新版本(Update)的时候就可以看到你的修改了。

20、Show log(显示日志)
显示当前文件(夹)的所有修改历史。SVN支持文件以及文件夹独立的版本追溯。

21、Repo-Browser(查看当前版本库)
查看当前版本库,这是TortoiseSVN查看版本库的入口,通过这个菜单项,我们就可以进入配置库的资源管理器,然后就可以对配置库的文件夹进行各种管理,相当于我们打开我的电脑进行文件管理一样。

22、Revision Graph(版本图形)
查看当前项目或文件的修订历史图示。如果项目比较大型的话,一般会建多个分支,并且多个里程碑(稳定版本发布),通过这里,我们就可以看到项目的全貌。

23、Resolved(解决冲突)
如果当前工作拷贝和版本库上的有冲突,不能自动合并到一起,那么当你提交修改的时候,tortoisesvn就会提示你存在冲突,这时候你就可以通过这个菜单项来解决冲突。冲突的解决有两种,一种是保留某一份拷贝,例如使用配置库覆盖当前工作拷贝,或者反过来。还有一种是手动解决冲突,对于文本文件,可以使用tortoiseSVN自带的工具,它会列出存在冲突的地方,然后你就可以和提交者讨论怎么解决这个冲突。同时它也对Word有很好的支持

24、Update to Revision(更新至版本)
从版本库中获取某一个历史版本。这个功能主要是方便查看历史版本用,而不是回滚版本。注意:获取下来之后,对这个文件不建议进行任何操作。如果你做了修改,那么当你提交的时候SVN会提示你,当前版本已失效(即不是最新版本),无法提交,需要先update一下。这样你所做的修改也就白费了。

25、Revert(回滚)
如果你对工作拷贝做了一些修改,但是你又不想要了,那么你可以使用这个选项把所做的修改撤销

26、Cleanup(清除状态)
如果当前工作拷贝有任何问题的话,可以使用这个选项进行修正。例如,有些文件原来是版本控制的,但是你没有通过tortoiseSVN就直接删除了,但是tortoiseSVN还是保留着原来的信息(每个文件夹下都有一个.svn的隐藏文件夹,存放着当前文件夹下所有文件夹的版本信息)所以这就会产生一些冲突。可以使用cleanup来清理一下。

27、GetLock/ReleaseLock(加锁/解锁)
如果你不想别人修改某个文件的话,那么你就可以把这个文件进行加锁,这样可以保证只有你对这个文件有修改权。除非你释放了锁,否则别人不可能提交任何修改到配置库中

28、Branch/tag(分支/标签)
Branch是分支的意思。例如当在设计一个东西的时候,不同的人有不同的实现,但是没有经过实践检验,谁也不想直接覆盖掉其他人的设计,所以可以引出不同的分支。将来如果需要,可以将这些分支进行合并。
tag是打标签的意思。通常当项目开发到一定程度,已经可以稳定运行的时候,可以对其打上一个标签,作为稳定版。将来可以方便的找到某个特定的版本(当然我们也可以使用版本号来查找,但是数字毕竟不方便)
SVN对于分支和标签都是采用类似Linux下硬链接的方式(同一个文件可以存在两个地方,删除一个不会影响另一个,所做修改会影响另一个),来管理文件的,而不是简单的复制一份文件的拷贝,所以不会有浪费存储空间的问题存在。

29、Export(导出)
这个功能是方便我们部署用。当我们需要发布一个稳定版本时,就可以使用这个功能将整个工程导出到某个文件夹,新的文件夹将不会包含任何版本信息了。

30、Relocate(版本库转移)
当我们版本库发生转移的时候就需要用到这个功能了。例如我原先的版本库是建在U盘上的,现在转移到(复制整个配置库文件夹)开发服务器上,使用https代替文件系统的访问。因此就需要将原来的工作拷贝的目标版本库重新定位到开发服务器上。

31、create patch(创建补丁)
创建补丁。如果管理员不想让任何人都随便提交修改,而是都要经过审核才能做出修改,那么其他人就可以通过创建补丁的方式,把修改信息(补丁文件)发送给管理员,管理员审核通过之后就可以使用apply patch提交这次修改了。

分类: Git版本管理工具 标签:

使用 SVN post-commit 钩子同步更新代码

2016年10月25日 评论已被关闭

使用 SVN post-commit 钩子同步更新代码
http://www.cnblogs.com/edwardlost/archive/2011/12/27/2303287.html
SVN的“钩子”脚本在代码版本库的hooks子目录下,该目录下已有一批 *.tmpl 的“钩子”脚本模版文件,复制 post-commit.tmpl 到 post-commit 文件,在文件中写入需要在 SVN Server 处理完提交操作后执行的shell命令,一般多为通知提醒或者代码自动同步等动作。

下面是一份自动同步更新代码到指定工作版本目录的示例脚本:

复制代码
REPOS=”$1″ # 版本库目录 /data2/svnrepos/rain
REV=”$2″ # revision number

# 若是edward提交的则不执行同步操作
AUTHOR=`/data2/subversion/bin/svnlook author -r $REV $REPOS` # 执行提交的用户名
if [ “$AUTHOR” == “edward” ] ; then
exit;
fi

TIME=`date ‘+%F %T’`
echo “[$TIME]–[$AUTHOR] svn commit file:” >> /data2/logs/svn_rain_update.log

# 将修改了的文件同步更新到目标版本库
for updatePath in `/data2/subversion/bin/svnlook changed -r $REV $REPOS | awk ‘{print $2}’`
do
fullUpdatePath=”/data2/rain/$updatePath”
/data2/subversion/bin/svn update –username xxx –password xxx $fullUpdatePath >> /data2/logs/svn_rain_update.log
chmod g+w $fullUpdatePath
done
复制代码

常见问题

1. Warning: post-commit hook failed (exit code 255) with no output.

如果执行提交时SVN提示255错误,则是 post-commit 脚本文件的权限不对,post-commit 脚本必须有 +x 权限。

chown svn:svn post-commit
chmod +x post-commit

SVN 使用学习记录

2016年10月21日 评论已被关闭

SVN 使用学习记录

http://www.cnblogs.com/kissdodog/archive/2013/10/25/3387657.html

一、基本SVN操作

安装了SVN之后,在本机上点击右键,就能够看到如下信息:

  1、建立SVN Repository

下面来建立一个SVN Repository。这个文件夹是同步用的,你可以放在本机的任意目录,也可以放在公司的服务器上面。

建立SVN Repository的步骤如下:

任意选择一个空目录 =》 右键 =》 选择TortoiseSVN->Create repository here

点击后会出现如下界面,给你一个路径:

  file:///E:\测试SVN

  2、建立工作目录

下面我们来建立一个工作目录,工作目录就是你经常在这里执行修改的地方,修改完之后再Comit到Repository里。

步骤如下:

创建一个空目录 =》 右键 SVN checkout => 弹出如下目录:

下面给出Check Depth各个选项的含义:

  1. Fully recursive——全递归:检出完整的目录树,包含所有的文件或子目录。
  2. Immediate children,including folders——直接子节点,包含文件夹:检出目录,包含其中的文件或子目录,但是不递归展开子目录。
  3. Only file chlidren——仅文件子节点:检出指定目录,包含所有文件,但是不检出任何子目录。4、Only this item——仅此项:只检出目录。不包含其中的文件或子目录。

点击OK之后,看到如下界面:

这个操作之后,工作目录与Repository仓库目录就正式联系起来了。下面说下各种操作的意义。

  3、SVN Comit And SVN Update

由于这时Working目录与Repository目录已经关联起来了,因此这时候我们对Working目录的修改都可以保存到Repository中去。

这时候我们再来在Working文件夹上右键,看到原来的SVN Checkout已经变成了SVN Comit与SVN Update。

  •   SVN Comit:将Working的修改同步到Reposiroty。
  •   SVN Update:将Working更新为与Repository的同步。因为通常在开发当中,一般是多人开发,所以Repository经常由别人更新,我们要获得最新版。

下面来说一个容易混淆的地方。

右键Working TortoiseSVN =》 Add 的作用是什么呢?

它的作用是将对Working目录下的一些文件标记为要添加,这样在你下次要Comit的时候就会自动选中,如果不Add的话,Comit的时候要手动选中。

另外,标记过为Add和没标记过为Add的图标也有区别。

下面列出SVN常见状态图标:

其他常用右键操作说明

Rename:标记重命名;

Delete:标记删除;

merge:合并;

Revert:撤销更改;

Get lock:加锁;

Release lock:释放锁;

Settings:设置;

Check out和Export的区别:Export也可以获取到代码,但是只有Checkout有验证的功能,Checkout到某处的代码,将会被TortoiseSVN监视,里面的文件可以享受各种SVN的服务。

  4、SVN配置账号密码

换账号时,需要清空一次SVN账号才可以重新输入,清空方式如下:

二、Visual Studio中使用SVN

首先安装VisualSVN,注意这个与SVN版本有些关系,如果SVN版本太低的话会提示安装更高级别的版本。

安装完SVN之后,设置VS 2010的版本管理为SVN。

OK,这样就可以了,然后其他什么的操作都跟在资源管理器里操作文件差不多了。

 

分类: Git版本管理工具 标签: