2

我正在整理一个 bash 命令来从旧的 SVN 存储库中查找 Git 提交。这是我的整个命令:

$ svn log --xml --revision 323016 http://svn.php.net/repository | grep "<msg>" | sed 's/<msg>//' | xargs --verbose -i% git log --pretty=oneline --grep=\"%\"
git log --pretty=oneline --grep="Always restore PG(magic_quote_gpc) on request shutdown"

运行命令的前几部分会给我提交评论:

$ svn log --xml --revision 323016 http://svn.php.net/repository | grep "<msg>" | sed 's/<msg>//'
Always restore PG(magic_quote_gpc) on request shutdown

所以这很好 - 但是当我想通过 xargs 使用 git log --grep 时,它不起作用(给我没有回应)。

这是奇怪的部分......--verbose为我打印出命令。如果我复制并粘贴那个确切的命令,我会得到我需要的输出。那是:

$ git log --pretty=oneline --grep="Always restore PG(magic_quote_gpc) on request shutdown"
87c038be06b8b0eb721270f98c858fd701f5d54b Always restore PG(magic_quote_gpc) on request shutdown

此外,由于某种原因,这不起作用:

$ echo -n "Always restore PG(magic_quote_gpc) on request shutdown" | xargs --verbose -i% git log --grep=\"%\"
git log --grep="Always restore PG(magic_quote_gpc) on request shutdown"

所以这一定是我对 xargs 的使用,对吧?

4

2 回答 2

2

我会将您通过 xargs 执行的命令包装到 sh

git rev-parse HEAD | xargs -n 1 -i{} sh -e "git log -1 {}"

我用它来解决一些转义问题以及为 xargs 传递的每个项目执行复杂的脚本:

git rev-parse HEAD | xargs -n 1 -i{} sh -e "some crazy looped code with {} embedded in multple places"
于 2012-08-10T23:39:11.790 回答
0

问题是您正在转义引号。我不知道为什么这是个问题,但我试过了,问题肯定出在转义引号上。不知何故,当 xargs 调用命令时,它会将这些引号作为参数的一部分,因此Always restore PG(magic_quote_gpc) on request shutdown您不是在搜索 ,而是在搜索"Always restore PG(magic_quote_gpc) on request shutdown"。以下内容应该适合您:

svn log --xml --revision 323016 http://svn.php.net/repository | grep "<msg>" | sed 's/<msg>//' | xargs --verbose -i% git log --pretty=oneline --grep="%"
于 2012-08-10T19:23:28.737 回答