git日志--文件列表很漂亮吗?
我正在尝试使用'git log-pretty=tformat'创建xml文件日志。但是,我在获取每次提交的文件列表时遇到问题 例如: 我使用这个命令git日志--文件列表很漂亮吗?,git,Git,我正在尝试使用'git log-pretty=tformat'创建xml文件日志。但是,我在获取每次提交的文件列表时遇到问题 例如: 我使用这个命令 $echo '<?xml version="1.0"?>' > out.xml $echo '<git>' >> out.xml $git log --pretty=tformat:' <commit>%n <h1>%s</h1>%n <
$echo '<?xml version="1.0"?>' > out.xml
$echo '<git>' >> out.xml
$git log --pretty=tformat:' <commit>%n <h1>%s</h1>%n </commit>' --name-only >> out.xml
$echo '</git>'>> out.xml
输出:
<?xml version="1.0"?>
<git>
<commit>
<h1>Commit 1</h1>
</commit>
<commit>
<h1>Commit 2</h1>
</commit>
<commit>
<h1>Commit 3</h1>
</commit>
</git>
我想在文件列表的commit标记旁边添加标记,以便最终输出如下所示
<?xml version="1.0"?>
<git>
<commit>
<h1>Commit 1</h1>
<list>file1</list>
</commit>
<commit>
<h1>Commit 2</h1>
<list>file2</list>
</commit>
<commit>
<h1>Commit 3</h1>
<list>file3</list>
</commit>
</git>
我尝试了-仅命名它将列出文件,但无法格式化输出
任何帮助都将不胜感激。这可能不是您想要的,但很容易编写脚本。下面是一个实现,效率低下但功能正常。小心运行它:它将在您的整个历史记录中运行。将第二行更改为revlist=$git rev list-10 HEAD,以查看它仅在最后10次提交时工作。根据上面的示例,它还假设您希望在文件底部有较旧的提交。如果您希望按时间顺序排列,请在git版本列表中添加-reverse标志:
#!/bin/sh
revlist=$(git rev-list HEAD)
(
echo '<?xml version="1.0"?>'
echo '<git>'
for rev in $revlist
do
files=$(git log -1 --pretty="format:" --name-only $rev)
echo ' <commit>\n <h1>\c'
echo "$(git log -1 --pretty="%s" $rev)\c"
echo '</h1>'
for file in $files
do
echo " <list>$file</list>"
done
echo ' </commit>'
done
echo '</git>'
) > out.xml
这可能不是您想要的,但很容易编写脚本。下面是一个实现,效率低下但功能正常。小心运行它:它将在您的整个历史记录中运行。将第二行更改为revlist=$git rev list-10 HEAD,以查看它仅在最后10次提交时工作。根据上面的示例,它还假设您希望在文件底部有较旧的提交。如果您希望按时间顺序排列,请在git版本列表中添加-reverse标志:
#!/bin/sh
revlist=$(git rev-list HEAD)
(
echo '<?xml version="1.0"?>'
echo '<git>'
for rev in $revlist
do
files=$(git log -1 --pretty="format:" --name-only $rev)
echo ' <commit>\n <h1>\c'
echo "$(git log -1 --pretty="%s" $rev)\c"
echo '</h1>'
for file in $files
do
echo " <list>$file</list>"
done
echo ' </commit>'
done
echo '</git>'
) > out.xml
我设法将所有文件信息作为一个文本字段来获取,只需对文件进行一些小的操作,然后使用以下powershell脚本将前两行移动到文件末尾:将REPONAME替换为存储库的名称,可以进一步自动化
git --git-dir <path to repository> log --name-only --pretty=format:"]]></files>%n</commit>%n<commit>%n<repo>REPONAME</repo>%n<hash>%H</hash>%n<author>%an</author>%n<dt>%ct</dt>%n<subject><![CDATA[%s]]></subject>%n<files><![CDATA[" | Out-File REPONAME.xml
$x = get-content REPONAME.xml
@("<gitrepo>") + $x[2..$x.count] + $x[0..1] + @("</gitrepo>") | set-content REPONAME.xml
为了分割文件,我必须在数据库中做一些进一步的处理,例如分割换行符等,但这超出了这个答案的范围
这将输出一个如下所示的文件:
<gitrepo>
<commit>
<repo>REPONAME</repo>
<hash>388d77493cb2b4d3260cd12b1adcf23e947755f4</hash>
<author>Some Guy</author>
<dt>1401802177</dt>
<subject><![CDATA[Comments added to files]]></subject>
<files><![CDATA[
src/aben/blanksid.w
src/aben/c_typop.w
src/aben/freg.w
src/aben/freskid.w
src/aben/grit5.w
src/aben/grokli.w
]]></files>
</commit>
</gitrepo>
我设法将所有文件信息作为一个文本字段来获取,只需对文件进行一些小的操作,然后使用以下powershell脚本将前两行移动到文件末尾:将REPONAME替换为存储库的名称,可以进一步自动化
git --git-dir <path to repository> log --name-only --pretty=format:"]]></files>%n</commit>%n<commit>%n<repo>REPONAME</repo>%n<hash>%H</hash>%n<author>%an</author>%n<dt>%ct</dt>%n<subject><![CDATA[%s]]></subject>%n<files><![CDATA[" | Out-File REPONAME.xml
$x = get-content REPONAME.xml
@("<gitrepo>") + $x[2..$x.count] + $x[0..1] + @("</gitrepo>") | set-content REPONAME.xml
为了分割文件,我必须在数据库中做一些进一步的处理,例如分割换行符等,但这超出了这个答案的范围
这将输出一个如下所示的文件:
<gitrepo>
<commit>
<repo>REPONAME</repo>
<hash>388d77493cb2b4d3260cd12b1adcf23e947755f4</hash>
<author>Some Guy</author>
<dt>1401802177</dt>
<subject><![CDATA[Comments added to files]]></subject>
<files><![CDATA[
src/aben/blanksid.w
src/aben/c_typop.w
src/aben/freg.w
src/aben/freskid.w
src/aben/grit5.w
src/aben/grokli.w
]]></files>
</commit>
</gitrepo>
与实际问题有点无关,但是如果您看一看xml2,在这种情况下构造XML可能会简单一些。与实际问题有点无关,但是如果您看一看xml2,在这种情况下构造XML可能会简单一些。很好!有没有办法获取诸如文件是否被修改、删除或添加之类的信息?@NikhilGupta:是的,尝试用-name状态替换-name only。在文件名之前打印的短代码设计为机器可解析。搜索-diff过滤器以查看代码的含义。然后只需添加一些逻辑来处理这些代码,就可以了。很好!有没有办法获取诸如文件是否被修改、删除或添加之类的信息?@NikhilGupta:是的,尝试用-name状态替换-name only。在文件名之前打印的短代码设计为机器可解析。搜索-diff过滤器以查看代码的含义。然后只需添加一些逻辑来处理这些代码,就可以了。