SVN中的两种冲突
1. 文件冲突(file conflict)是什么?
- 文件冲突指的是:
多人对同一个文件的同一个部分进行了不同修改。
- 例如:你和同事同时编辑
a.txt
的第5行内容,提交更新时就会发生文件冲突。
常见表现
- SVN 会把有冲突的部分插入一些
<<<<<<<
、=======
、>>>>>>>
标记,等你手动合并/选择。
- 你需要打开文件合并或直接重新编辑。
2. 树冲突(tree conflict)是什么?
- 树冲突是 SVN 1.6 及以后的概念。
- 所谓“树”其实指目录结构/文件结构(不是树状控件,也不是数据结构的树,而是整个项目的文件、文件夹组成的目录树)。
- 树冲突出现在:
针对目录结构操作(如文件/文件夹的新增、重命名、删除、移动)时,不同人对同一部分目录树做了结构性变化,并发生了冲突。
典型例子
- 你删除了某个文件/文件夹,同事修改了这个文件
- 你删了
A/B/C.cs
,同事还在同一版本上编辑C.cs
,你们都提交,然后更新。你就会遇到tree conflict
。
- 一方移动/重命名目录,另一方在原地新建或修改文件
- 父目录被删除、子文件被修改或反之
- 任何目录或者文件在结构上发生变化,而非内容修改
SVN撤回某一次提交
你想撤销130次提交的内容(可能此后还有131、132、133…的正常提交),只撤销这次的内容,其后的变动继续存在。
操作命令
svn merge -c -130 你的工作副本目录
svn commit -m “撤销r130提交内容”
-c参数后面加上负号-130,表示“撤销 r130”的变更。
执行后记得到工作副本看下变动,再commit。
举例
如你的项目地址为http://xxx.com/svn/project/trunk,你在trunk目录下:
svn merge -c -130 .
svn commit -m “撤销第130次提交”
SVN查看当前Revision
写一个可以查询当天提交记录的shell脚本
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182
| #!/bin/bash
# 用法: ./svn_tag_summary.sh /path/to/your/svn/working_copy
SVN_PATH="$1"
AUTHOR="liyinuo@tuyoogame.com"
TODAY=$(date +"%Y-%m-%d")
if [[ ! -d "$SVN_PATH/.svn" ]]; then
echo "路径 $SVN_PATH 不是svn仓库"
exit 1
fi
cd "$SVN_PATH" || exit 1
# 获取今天该作者的提交记录
svn log -r {${TODAY}T00:00:00}:{${TODAY}T23:59:59} --search "$AUTHOR" --verbose --xml > __svn_today.xml
if ! grep -q "<logentry" __svn_today.xml; then
echo "没有今天作者 $AUTHOR 的提交记录"
rm -f __svn_today.xml
exit 0
fi
# 取所有 commit message
msgs=$(xmllint --xpath '//logentry[author="'$AUTHOR'"]/msg/text()' __svn_today.xml 2>/dev/null | grep -v '^$')
# 各分类字符串
feat_msgs=""
fix_msgs=""
refactor_msgs=""
docs_msgs=""
test_msgs=""
chore_msgs=""
other_msgs=""
while IFS= read -r line; do
if [[ "$line" =~ ^\[feat\][[:space:]]*[::]? ]]; then
feat_msgs="${feat_msgs}${line}"$'\n'
elif [[ "$line" =~ ^\[fix\][[:space:]]*[::]? ]]; then
fix_msgs="${fix_msgs}${line}"$'\n'
elif [[ "$line" =~ ^\[refactor\][[:space:]]*[::]? ]]; then
refactor_msgs="${refactor_msgs}${line}"$'\n'
elif [[ "$line" =~ ^\[docs\][[:space:]]*[::]? ]]; then
docs_msgs="${docs_msgs}${line}"$'\n'
elif [[ "$line" =~ ^\[test\][[:space:]]*[::]? ]]; then
test_msgs="${test_msgs}${line}"$'\n'
elif [[ "$line" =~ ^\[chore\][[:space:]]*[::]? ]]; then
chore_msgs="${chore_msgs}${line}"$'\n'
else
other_msgs="${other_msgs}${line}"$'\n'
fi
done <<< "$msgs"
echo "作者: $AUTHOR 今天的提交分类如下:"
echo
if [ -n "$feat_msgs" ]; then
echo "---------------- [feat] ----------------"
echo "$feat_msgs"
fi
if [ -n "$fix_msgs" ]; then
echo "---------------- [fix] ----------------"
echo "$fix_msgs"
fi
if [ -n "$refactor_msgs" ]; then
echo "---------------- [refactor] ----------------"
echo "$refactor_msgs"
fi
if [ -n "$docs_msgs" ]; then
echo "---------------- [docs] ----------------"
echo "$docs_msgs"
fi
if [ -n "$test_msgs" ]; then
echo "---------------- [test] ----------------"
echo "$test_msgs"
fi
if [ -n "$chore_msgs" ]; then
echo "---------------- [chore] ----------------"
echo "$chore_msgs"
fi
if [ -n "$other_msgs" ]; then
echo "---------------- [other] ----------------"
echo "$other_msgs"
fi
rm -f __svn_today.xml
|
1. SVN 删除一个文件后如何用命令行提交这个修改
删除文件后,请按以下步骤操作:
(1)删除文件
1 2 3
| svn delete 文件名 # 比如 svn delete test.txt
|
或者直接
(2)提交删除操作
1
| svn commit -m "删除了test.txt文件"
|
2. SVN 使用命令行 Add to working copy
如果您想将某个文件或目录添加到您的工作副本(working copy),即包含到版本控制,命令如下:
(1)添加文件或目录
1 2 3
| svn add 文件名或目录名 # 比如 svn add newfile.txt
|
如果是新文件夹,可以递归添加内部全部新文件:
1
| svn add newfolder --force
|
(2)提交添加操作
1
| svn commit -m "添加了新文件(或文件夹)"
|
总结
删除后提交:
1 2
| svn delete 文件 svn commit -m "说明"
|
新增后提交:
1 2
| svn add 文件 svn commit -m "说明"
|