SVN常用命令说明


1.检出(checkout)

命令格式:
svn checkout svn://目录或文件的路径 [本地路径] --username 用户名

$svn checkout svn://mcucode.cn/test --username dachun

参数说明:
1.如果不带--password参数传输密码的话,会提示输入密码,建议不要用明文的--password 选项;
2.不指定本地目录全路径,则检出到当前目录下;
3.checkout命令可以简写为co.


2.导出(export)

命令格式:

svn export [-r 版本号] svn://目录或文件的路径 [本地路径] --username 用户名
svn export 检出的目录路径(本地) 导出目录路径

$svn export svn://mcucode.cn/test --username dachun
$svn export /home/testchk /home/testexp

参数说明

1.可以选择从版本库导出,或者从本地检出的目录中导出;
2.如果指定了版本号,会导出相应的版本,如果没有指定修订版本,则会导出最新的;
3.本地路径,指定位置导出位置,未指定时URL的最后一部分会作为本地目录的名字导出在当前目录;
4.从本地导出时,所有的本地修改将会保留,但是不在版本控制下(即没提交的新文件,因为.svn文件夹里没有与之相关的信息记录)的文件不会拷贝;


3.添加新文件(add)
命令格式:
svn add 文件名

$svn add test.php
$svn commit -m “添加我的测试用test.php“ test.php
$svn add *.php 
$svn commit -m “添加当前目录下所有的php文件“ *.php

注意事项:
添加文件后还需要用svn commint -m命令真实的上传上去!


4.提交(commit)

svn commit -m “提交备注信息文本“ [-N --no-unlock] 文件名

$svn commit -m “提交当前目录下的全部在版本控制下的文件“ *
$svn commit -m “提交我的测试用test.php“ test.php
$svn commit -m “提交我的测试用test.php“ -N --no-unlock test.php

参数说明:
1.必须带上-m参数,参数可以为空(不建议为空),但是必须写上-m;
2.可以用通配符(正则表达式?),*表示全部文件;
3.-–no-unlock保持锁开关;
4.commit命令可简写为ci;


5.更新文件(update)
命令格式:
svn update [-r 修正版本] [文件名]

$svn update
$svn update -r 200 test.cpp
$svn update test.php

参数说明:
1.默认将当前目录以及子目录下的所有文件都更新到最新版本;
2.-r 表示版本回滚到指定版本;
3.如果指定文件名,则只更新指定文件;


6.删除文件(delete)
svn delete svn://目录或文件的路径 -m “删除备注信息文本”

$svn delete test.php 
$svn commit -m “删除测试文件test.php”

删除后记得及时提交


7.加锁/解锁(lock/unlock)

svn lock -m “加锁备注信息文本“ [--force] 文件名
svn unlock 文件名

$svn lock -m “锁定测试用test.php文件“ test.php 
$svn unlock test.php

8.比较差异(diff)
svn diff [-r 修正版本号m:修正版本号n] 文件名

$svn diff test.php
$svn diff -r 200:201 test.php

9.查看文件或者目录状态

svn status [-v] 目录路径/文件名

$svn status PlaneCtrl

不带参数-v时,显示状态(正常状态不显示):
?:不在svn的控制中;
M:内容被修改;
C:发生冲突;              
A:预定加入到版本库;
K:被锁定

$svn status -v PlaneCtrl

带参数-v时             
第一列为文件状态;
第二列显示工作版本号;               
第三和第四列显示最后一次修改的版本号和修改人

注意事项:
1.可以简写为st.
2.svn status、svn diff和 svn revert这三条命令在没有网络的情况下也可以执行的,原因是svn在本地的.svn中保留了本地版本的原始拷贝。


10.查看日志

功能描述:显示文件的所有修改记录,及其版本号的变化
命令格式:svn log 文件名

$svn log test.php

参数说明:
-r num 显示指定版本的修改日志;
-q 简要显示日志
-v 详细显示日志
--limit n 显示最近的N条日志;


11.查看文件详细信息
svn info 文件名

$svn info test.php

12.SVN 帮助
全部功能选项

$svn help

具体功能的说明

$svn help commit

13.查看版本库下的文件和目录列表
svn list svn://目录或文件路径

svn list svn://localhost/test

显示svn://localhost/test目录下的所有属于版本库的文件和目录
该命令可以简写为ls


14.创建纳入版本控制下的新目录

svn mkdir 目录名
svn mkdir -m "新增目录备注文本" svn://目录全路径

$svn mkdir newdir
$svn mkdir -m "Making a new dir." svn://localhost/test/newdir 

添加完子目录后,一定要回到根目录更新一下,不然在该目录下提交文件会提示“提交失败”

$svn update

注意事项:
如果手工在checkout出来的目录里创建了一个新文件夹newsubdir,
再用svn mkdir命令时,SVN会提示错误:

$svn mkdir newsubdir
svn: 尝试用 “svn add”或 “svn add --non-recursive”代替?
svn: 无法创建目录“newsubdir”: 文件已经存在

此时,用如下命令解决:

$svn add --non-recursive newsubdir

在进入这个newsubdir文件夹,用ls -a查看它下面的全部目录与文件,会发现多了:.svn目录,
再用命令

$svn mkdir -m "添newsubdir功能模块文件" 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 test.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让你的工作拷贝知道你已经完成了所有事情。
你可以仅仅删除冲突的文件并且提交,但是svn resolved除了删除冲突文件,还修正了一些记录在工作拷贝管理区域的记录数据,所以我们推荐你使用这个命令。


18.不checkout而查看输出特定文件或URL的内容

$svn cat http://localhost/test/readme.txt

19.新建一个分支(copy)

从branchA拷贝出一个新分支branchB

$svn copy branchA branchB  -m "make B branch" 

20.合并内容到分支(merge)
把对branchA的修改合并到分支branchB

$svn merge branchA branchB 

SVN数据库迁移
1.数据导出

$svnadmin dump /opt/svndata/repos > ~/repos_backup.dump

注意事项:
可以采用-r参数导出指定版本
-r ver
-r vera:varb
可以用svnlook命令查看最新版本;

2.在目标机上建立新的svn存储库

#svnadmin create /opt/svndata/repos

3.导入存储库数据

#svnadmin load /opt/svndata/repos < ~/repos_backup.dump

注意事项:
1.数据导出导入只能按项目来进行;
2.仅导入/导出数据,不导出配置文件;
3.如果只导出了部分版本,导入时从1开始重新记数版本号;


查看版本库最新版本号

 $svnlook youngest /opt/svndata/repos

- 阅读全文 -

SVN服务器安装与配置


操作系统:Centos 7.0/Debian 8.0


源码安装

1.下载源码

#wget http://subversion.tigris.org/downloads/subversion-1.4.0.tar.gz
#wget http://subversion.tigris.org/downloads/subversion-deps-1.4.0.tar.gz

#tar -xvf subversion-1.4.0.tar.gz
#tar -xvf subversion-deps-1.4.0.tar.gz

2.编译安装

#cd subversion-1.4.0
#./configure -–without-berkeley-db –with-zlib --enable-shared

配置说明:
以svnserve方式运行,不加apache编译参数(现在都用nginx了),以fsfs格式存储版本库;
–without-berkeley-db 不编译berkeley-db(一种数据库);
--enable-shared 共享库,重要,如果不添加编译时会产生-fPIC之类错误;
–prefix 指定安装目录,可以采用默认;

#make clean
#make
#make install

也可采用yum/apt-get安装

Centos

#yum install subverison

Debian

#apt-get install subverison

3.测试

#svnserve –version

4.添加系统服务
新建启动脚本:

#vi /lib/systemd/system/svn.service

内容如下:

[Unit]
Description=svn server daemon
After=network.target

[Service]
Type=forking
ExecStart=/usr/local/bin/svnserve -d -r /opt/svndata

[Install]
WantedBy=multi-user.target

至此可以使用systemctl命令来启动/关闭和重启服务了;
-d 表示以daemon(后台)方式运行;
-r 指定svn工程目录;
–listen-port 8888 表示指定8888端口(不建议修改);

添加开机启动

#systemctl enable svn.service

1. 建立版本库

#mkdir -p /opt/svndata/repos
#svnadmin create /opt/svndata/repos

2. 修改配置(每个版本库一个配置)

#vi /opt/svndata/repos/conf/svnserve.conf

内容修改为:

[general]
anon-access = none
auth-access = write
password-db = /etc/svn/passwd
authz-db = authz
realm = repos

注意事项:
password-db是指明该版本库的用户名和密码:
一种是全局统一(建议);另一种是每个版本库一套;
authz-db是指明用户权限,建议每个版库权限独立;
realm 为显示名称;

3.配置用户

#vi /etc/svn/passwd

内容修改为

[users]
alex   = 123456
dachun = 888888

注意事项:
由于此文件保存了明文密码,所以注意权限设置为root以外的其他用户不可读;

4.配置用户权限

#vi /opt/svndata/repos/conf/authz

内容修改为

#新建了一个名为admin的用户组
[groups]
admin = alex

#根目录的权限
[/]
@admin = rw
* = 

#子目录权限
[/abc]
dachun = rw

注意事项:
1.此文件由svnserve.conf中指定;
2.dachun仅对abc目录有读写权限;
3.如果在全局中定义权限,子目录需指明版本库名称[repos:/abc]


添加http协议支持

web服务器:apache2


1.安装dav_svn模块

# apt-get install libapache2-svn

2.添加模块dav_svn模块

# ln -s /etc/apache2/mods-availables/dav.load /etc/apache2/mods-enabled/dav.load;
# ln -s /etc/apache2/mods-availables/dav_svn.load /etc/apache2/mods-enabled/dav_svn.load;
# ln -s /etc/apache2/mods-availables/dav_svn.conf /etc/apache2/mods-enabled/dav_svn.conf;

3.修改配置文件dav_svn.conf

# 可以有多个Location,每个Location对应一个版本库
<Location /svn>
  DAV svn    

  # 指定版本库存路径
  SVNPath /opt/svndata/repo

  AuthType Basic
  AuthName "My SVN Repo"
  
  # 用户权限认证文件
  AuthUserFile /etc/apache2/dav_svn.passwd    
  AuthzSVNAccessFile /opt/data/svndata/code/conf/authz

  Require valid-user
</Location>

4.创建SVN用户、密码

# htpasswd /etc/apache2/dav_svn.passwd alex
New password: 
Re-type new password: 
Adding password for user alex

注意事项:
这里的用户名和密码与svn协议下的用户名密码不是同一套东西;

5.SVN权限设置
权限设置都是相同的,可以采用同一个权限文件;

6.测试
重启apache2,在浏览器地址输入http://svn.mcucode.cn/svn;


http://www.ibm.com/developerworks/cn/java/j-lo-apache-subversion/

- 阅读全文 -

ARM汇编笔记--伪指令


AREA指令:
用于定义一个代码段或数据段;

语法格式:

    AREA  段名, 属性1, 属性2, ...

常用属性:

CODE属性:用于定义代码段,默认为READONLY;
DATA属性:用于定义数据段,默认为READWRITE;
READONLY属性:指定本段为只读;
READWRITE属性:指定本段为读写;

ALIGN属性:指定字节对齐,其值表示的意思是2的次幂;

使用示例:

    AREA  Init, CODE,READONLY,ALIGN=3

定义了一个名称为Init的只读代码段,8字节对齐;


CODE16/CODE32指令:

通知编译器其后的指令为Thumb/ARM指令;


ENTRY指令:

指定汇编程序的入口点,在一个完整的汇编程序中,至少要有一个ENTRY;
如果有多个ENTRY时,程序入口由链接器指定;
但一个源文件中最多只能有一个ENTRY(也可以没有);


EQU指令:
用于为程序中的常量,标号等定义一个等效的字符串名称;
其中EQU可以用 “*”代替;

使用示例:

TEST EQU 50           ; 定义标号TEST的值为50
ADDR EQU 0x55, CODE32 ; 定义标号ADDR的值为0x55,并且该处为32位的ARM指令

IF指令:
根据条件是否成立与否决定是否执行某个指令序列。
ARM的汇编语句中有一些语句是放在了方括号[ ]中的,
[与IF同义,|与ELSE同义, ]与ENDIF同义

形式一:

    [   条件语句        
        指令序列
    ]

相当于

    IF 条件语句        
       指令序列1
    ENDIF

其意义是:如果第一句条件语句为真,则下面的执行语句有效,否则跳出方括号。

形式二:

    [ 条件语句
        指令序列1
    |
        指令序列2
    ]

相当于

    IF 条件语句
       指令序列1
    ELSE
       指令序列2
    ENDIF

WHILE指令:
根据条件是否成立与否决定是否循环执行某个指令序列。

    WHILE  条件语句
        指令序列
    WEND

- 阅读全文 -

S3C2440启动代码分析


启动位置判断:
首先判断启动位置(NandFlash, NorFlash, RAM),
如果是从NandFlash启动,则将代码从NandFlash读入RAM中,再运行(重点)。

    ldr     r0, =BWSCON
    ldr     r0, [r0]
    ands    r0, r0, #6          ;OM[1:0] != 0, NOR FLash boot
    bne     copy_proc_beg       ;do not read nand flash
    adr     r0, ResetEntry      ;OM[1:0] == 0, NAND FLash boot
    cmp     r0, #0              ;if use Multi-ice, 
    bne     copy_proc_beg       ;do not read nand flash for boot

代码搬移:

nand_boot_beg
    mov    r0, #0
    ldr    r1, =ResetEntry
    mov    r2, #0x40000
    
    [ {TRUE}
        bl    RdNF2SDRAM
    ]
    ldr    pc, =copy_proc_beg
/*
 * 功能描述: 将Flash中的内容读至RAM中
 * 参数列表: addr(r0) - 源地址(Flash)
 *           dest(r1) - 目标地址
 *           size(r2) - 数据长度
 * 注意事项:
 * 1. 通过芯片ID来确定芯片容量(分页值),并调用不同的时序;
 * 2. 汇编调用时,参数依次分别从r0,r1,r2传入;
 */
void RdNF2SDRAM(int addr, char* dest, int size)
{
    U32 i;
    unsigned char * to = (unsigned char *)dest;
    rNF_Init();
    switch(rNF_ReadID())
    {
        case 0x76:
        {
            for(i = (addr >> 9); size > 0; )
            {
                rSB_ReadPage(i, to);
                size -= 512;
                to   += 512;
                i++;
            }
            break;
        }
        case 0xf1:
        case 0xda:
        case 0xdc:
        case 0xd3:
        {
            for(i = (addr >> 11); size > 0; )
            {
                rLB_ReadPage(i, to);
                size -= 2048;
                to   += 2048;
                i++;
            }
            break;
        }
    }
}   

注意事项:
RdNF2SDRAM函数为C语言函数,入口共有3个参数,分别通过r0,r1,r2来传递(规定);
第1个参数为源地址,指数据在NandFlash中的起始地址;
第2个参数为目标地址,指将数据搬入RAM中的位置;
第3个参数为数据长度;

- 阅读全文 -

Linux应用程序--Mysql编程


文章摘要: 本文描述了基于C语言的Mysql数据库操作例程。
测试平台: Debian 8

#include <stdlib.h>
#include <stdio.h>
#include <mysql/mysql.h>
#include <syslog.h>
  
MYSQL mysql;
    
/* 查询操作 */
void do_query()
{
   MYSQL_ROW  m_row;
   MYSQL_RES* m_res;
   char sql[1024];
    
   sprintf(sql,"select * from caton_name_list;");
   if(mysql_query(&mysql,sql) != 0)
   {
      fprintf(stderr, "mysql_query err: %s",mysql_error(&mysql));
   }
   m_res = mysql_store_result(&mysql);
   if(m_res==NULL)
   {
      fprintf(stderr, "get result err: %s",mysql_error(&mysql));
   }
        
   while(m_row = mysql_fetch_row(m_res))
   {
      printf("%s\t %s\t %s\r\n",m_row[0],m_row[1],m_row[2]);
   }
     
   mysql_free_result(m_res);
}
  
/* 主程序 */
int main(int argc, char* argv[])
{
   char host[32]   = "localhost";
   char user[32]   = "username";
   char passwd[32] = "password";
   char dbname[32] = "dbname";
   
   if( mysql_init(&mysql) == NULL )
   {
      fprintf(stderr,"Init mysql err!");
      return -1;
   }
   
   // 连接数据库
   if(mysql_real_connect(&mysql,host,user,passwd,dbname,0,NULL,0)==NULL)
   {
      fprintf(stderr,"Connect to mysql Error:%s!",mysql_error(&mysql));
      return -1;
   }
   else
   {
      puts("Connect to mysql success!");
   }
      
   do_query();
   
   mysql_close(&mysql); // 关闭连接
   
   return 0;
}

编译:

#gcc -o mysql msyql.c -lmysqlclient

注意事项:
1.需要静态库libmysqlclient.a支持;

- 阅读全文 -


Copyright©2025 春天花会开, All Rights Reserved. Email: webmaster@oroct.com