git svn dcommit 提交失败,原因:assertion “svn_fspath__is_canonical(child_fspath)” faile

git svn dcommit 提交失败,原因:assertion “svn_fspath__is_canonical(child_fspath)” failed

在使用 git svn 作为客户端对一个 svn 库进行提交的时候出现了错误:

git svn dcommit
Committing to https://xx.xx.xx.xx/svn/xyz/trunk …
R CODING_STYLE.md => doc/CODING_STYLE.md
assertion “svn_fspathis_canonical(child_fspath)” failed: file “/usr/src/packages/subversion/subversion-1.8.5-1/src/subversion-1.8.5/subversion/libsvn_subr/dirent_uri.c”, line 2504, function: svn_fspathskip_ancestor
error: git-svn died of signal 6

错误发生在 cygwin 下,git 版本 1.7.9,svn 版本 1.8.5。

stackoverflow 上说,原因是 git 的重命名检测机制与 svn 发生了冲突。有两个解决方案:

  1. 把 svn 降级到 1.7.9,一劳永逸。
  2. 使用 git svn dcommit -C1 -l1 来提交。这样会关闭 git 的重命名检测机制,这次提交会丢失重命名操作,取而代之的是一次 remove 和 一次 add 操作,就和 svn 1.4 一样。

使用bash从SVN和Git中获取顺序版本号

使用bash从SVN和Git中获取顺序版本号

在进行自动部署的时候,经常需要用脚本获取程序的最新版本号,下面是我的两个解决方案。

for SVN

# 获取XML版本的svn信息,这样可以避免不同语言的问题
xml=`svn info --xml --incremental`
# 我们可以获取到2个版本号,一个是最新版本库版本号,一个是自己的提交版本号。删除自己提交的版本号。
revision=`echo "$xml"|sed '/revision/!d'|sed '$d'`
# 提取出版本号的数字部分
echo $revision|sed 's/revision="\([0-9]\+\)">\?/\1/'

for Git

Git采用的是SHA散列码作为版本号,因此它没有顺序的版本号。但我们可以通过统计Git版本库的提交次数来获得一个顺序版本号。

# 基准版本号默认是1,可以通过传递一个参数修改
get_version()
{
    local base=${1:-1}
    echo $((`git rev-list --all|wc -l` + $base))
}
get_version 7000

这个版本对网上搜到的那个被普遍转载的版本做了简化和调整。网上那个版本写得比较复杂,例如awk的使用没有必要,而且要统计所有提交,应该用 git rev-list --all 参数,而不是用 git rev-list HEAD

使用Git、Git GUI和TortoiseGit

使用Git、Git GUI和TortoiseGit

Using git, git gui and tortoisegit

  • 2015-06-15更新:加入姊妹篇
  • 2015-01-28更新:Mac OS X 的 GUI 工具选择
  • 2013-11-05更新:加入从 putty 切换到 OpenSSH
  • 2012-12-30更新:在安装的时候选择TortoiseGit使用的SSH客户端
  • 2012-12-26更新:在TortoiseGit中使用SSH host

注意: 本文不讲解任何关于Git提交、合并等等使用细节和语法,只记录作者在使用Git相关工具中碰到的问题和选择的经验。本文只是个人意见的集中,不代表适合所有人。如果你是 “被惯坏了的那批”,请不要介意。:-)


姊妹篇:Git查看、删除、重命名远程分支和tag


1. 关于命令行

我一直建议在命令行中使用Git或者SVN。因为这样可能更加了解他们的工作方式,也不容易遗漏重要的问题和提醒。

在Windows习惯的驱使下,大多数人是不会看弹出的对话框中有什么信息的,一般都是直接关掉。但是,版本库给我们的提示信息都是非常重要的,有的是冲突,有的是提交失败,等等,这些都被略过了。

我碰到的关于版本库使用问题主要包括下面这些: 继续阅读使用Git、Git GUI和TortoiseGit

使用svnsync实现已有版本库的镜像

使用svnsync实现已有版本库的镜像
svn不支持分布式开发,所以把svn版本库保存在一台服务器上是不安全的。制作一个镜像svn版本库有多种方式,我采用subversion自带的svnsync程序。

此教程基于Archlinux。windows用户请注意路径表示法。

源版本库路径:http://192.168.16.10/svn/project1
镜像版本库路径:/var/svn/project1 继续阅读使用svnsync实现已有版本库的镜像

Gitweb 和 WebSVN

我个人的版本库目前全部用Git,但公司的版本库则全部都是SVN,所以我是SVN+Git通用,只用命令行。

为了便于查看,我会为git和SVN搭建一个web查看环境,这方面就要依赖GitWeb和 WebSVN

关于这两者的配置和安装,Google中有非常多的教程(当然有优秀的教程和稀烂的教程,看你怎么找了),我不再给出详细的步骤,只说一下自己在配置中碰到的问题和注意事项。 继续阅读Gitweb 和 WebSVN

让svn将非标准扩展名识别为文本文件

为了方便分类,我经常会自定义文本文件的扩展名。比如json代表JSON格式的文本,md代表markdown格式的文本等等。这些文件都是纯文本文件,但svn在默认情况下,会将其识别成为二进制(bin)文件。

这样,在文件合并等操作时,就会出现问题。

用一句代码可以解决这个问题:

svn ps svn:mime-type text/plain *.md

处理完毕后,需要提交一次修改到服务器。

移动git管理的svn版本库的路径

一、起因

公司采用svn管理源码,因此我一直是用git svn来与svn服务器进行同步。由于当前工作的版本库中包含多个项目,而权限也没有细分,所以每个使用版本库的人都可以管理其他人的项目。这样一旦出现误操作,就会非常难以恢复。我前段时间就 碰上了这样的事情,还好找回了大部分的文件。

解决的办法有两个:

  1. 自己单独使用git管理源码
  2. 新建一个独立的svn库并设定独立权限

在windows server 2003上通过cygwin安装git服务器未果后,我只能选择后者了。

二、svn部分

当前工作的版本库的路径为: http://10.0.0.5:8080/svn/kaitian/trunk/fight/KTFight ,其中kaitian是该版本库的根目录。

我在服务器上新建了一个版本库,名为ktfight,路径为:http://10.0.0.5:8080/svn/ktfight ,希望这个版本库对应 http://10.0.0.5:8080/svn/kaitian/trunk/fight 的所有内容。

然后就是转移版本库的工作。原本考虑使用svnsync命令,但发现这个命令仅能sync根目录,不支持子目录。而我不希望新的版本库中保留原来版本库的其他项目的内容,放弃。

后来确定的命令是svndumpfilter,操作如下: 继续阅读移动git管理的svn版本库的路径