bash - 使用 git-svn 时模拟 subwcrev

标签 bash git-svn

我使用 git-svn 与包含一些 C++ 项目的现有 SVN 存储库进行交互。 subwcrev.exe 用作预构建事件以更新 C++ header (svnversion.h) 中的某些字符串。这些字符串被硬编译以形成生成的二进制文件的一些版本信息。

由于 subwcrev 需要 .svn 元数据才能工作,因此在 git-svn 工作副本上使用时预构建事件将失败。所以我想出了以下 bash 脚本,我将其用作我的 git 存储库的提交后和 checkout 后 Hook 。该脚本尝试根据 git svn info 的输出(缓存在本地文件中)执行与 subwcrev 相同的操作。

#!/bin/sh
if [ ! -f svninfo ] ; then
    git svn info > svninfo
fi

revision=`sed -e "/Revision/!d" -e "s/Revision: \(.*\)/\1/" svninfo`
lastchange=`sed -e "/Last Changed Rev/!d" -e "s/Last Changed Rev: \(.*\)/\1/" svninfo`
# Get the last changed date, extract timestamp, replaces dashes with slashes
changedate=`sed -e "/Last Changed Date/!d" -e "s/Last Changed Date: \(.\{19\}\).*/\1/" -e "s!-!\\\\\\/!g" svninfo`
now=`date "+%Y\/%m\/%d %H:%M:%S"`

gitcommit=`git show --abbrev-commit | sed -n -e "s/commit //p"`

for entry in $( find -name svnversion_template.h ); do
    newname=`echo $entry|sed -e "s/_template//"`
    sed -e "s/\\\$WCRANGE\\\$/${revision}/" \
        -e "s/\\\$WCREV\\\$/${lastchange}-${gitcommit}/" \
        -e "s/\\\$WCDATE\\\$/${changedate}/" \
        -e "s/\\\$WCNOW\\\$/${now}/" \
        -e "s/\\\$WCURL\\\$/local git repo/" \
        -e "s/\\\$WCMODS.*\\\$/(true)/" \
        -e "s/\\\$WCMIXED.*\\\$/(false)/" \
        $entry > `echo $entry|sed -e "s/_template//"`
done

到目前为止,我无法真正模拟的是自动检测本地未提交的更改(基于最后 checkout 的 SVN 修订版),这使得 subwcrev 非常有用。

我正在用 SVN 存储库的修订号替换 $WCREV$(正如 subwcrev 所做的那样),但这次我添加了我的缩写 git commit hash 来标识我编译的代码。我现在的问题是:有没有办法在 shell 脚本中区分我当前的 HEAD 是否不同于上次获取的 SVN 修订版,以便我可以省略添加 -${gitcommit} 部分并设置 $WCMODS$ 为假?

如果有类似post-"git svn dcommit" 钩子(Hook)的东西,我的问题也会得到解决,从那时起那个特殊的钩子(Hook)就会以不同的方式创建 svnversion.h。可以以某种方式添加这样的钩子(Hook)吗?

最佳答案

我不太明白你的意思,但首先要开始改进你的脚本。

revision=$(grep -Po "(?<=Revision: ).*" svninfo)
lastchange=$(grep -Po "(?<=Last Changed Rev: ).*" svninfo)
# Get the last changed date, extract timestamp, replaces dashes with slashes
changedate=$(grep -Po "(?<=Last Changed Date: ).{19}" svninfo)
changedate=${changedate//-//}
now=$(date "+%Y\/%m\/%d %H:%M:%S")

那么,在for循环中,请您详细说明一下,您需要什么结果? 你能展示一份 svnversion_template.h 样本吗?

关于bash - 使用 git-svn 时模拟 subwcrev,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1954062/

相关文章:

git - 将单独的 SVN 目录导入为 git 分支

bash - 对文件进行排序,将 10、11、12... 放在 1、2、3... 和 X、Y 之前

linux - 包装 bash find 命令

c - execv 的缓冲区大小

bash - zgrep - 列出匹配的文件名

bash - 更改日期字符串格式

windows - 是否有类似 TortoiseSVN 的 git-svn Windows 客户端?

git - 如何在不使用 .gitignore 的情况下保留文件的本地版本?

git - 在 SVN 到 Git 迁移期间将 SVN 远程分支和标签转换为本地 Git 分支/标签的正确方法是什么

svn - 将 git 镜像到 svn