获取文件更改和bug问题的Git日志
因此,我想获得有关git存储库中更改的信息。我使用了以下命令:获取文件更改和bug问题的Git日志,git,github,git-log,Git,Github,Git Log,因此,我想获得有关git存储库中更改的信息。我使用了以下命令: git log --name-only --oneline --pretty="%h,%an,%ci,%s" --decorate=full > change_log.csv 它会将信息保存在csv文件中,但csv文件中的文件名不在同一行中。 1。如何更改格式以获取标题后下一个单元格中的文件名? 2。我还想获取提供以下信息的故障日志,但不确定如何使用git日志获取这些信息? 3。如何获取错误问题的日志
git log --name-only --oneline --pretty="%h,%an,%ci,%s" --decorate=full > change_log.csv
它会将信息保存在csv文件中,但csv文件中的文件名不在同一行中。
1。如何更改格式以获取标题后下一个单元格中的文件名?
2。我还想获取提供以下信息的故障日志,但不确定如何使用git日志获取这些信息?
3。如何获取错误问题的日志信息:
回答#1
git日志输出的问题是,提交的某些字段可能包含CSV字段分隔符、换行符和引号。CSV要求这些值用双引号括起来“
,并且里面的引号应该重复:
aaa,"bbb1""bb
b2",ccc
git只能对文件名进行逃逸,但不能用于其他字段。请考虑此日志:
commit 4822fc186476b923e6a3a4758983898a4f799cdc (HEAD -> master)
Merge: 7f74ea0 e9d6448
Author: Joe <joe@acme.com>
Date: Tue Dec 22 10:29:10 2020 +0300
Merge branch "dev"
commit e9d644831f6c36a98f6868cde76ec2d259d5bc5c (dev)
Author: Joe <joe@acme.com>
Date: Tue Dec 22 10:28:35 2020 +0300
commit in side branch
some.txt
commit 7f74ea0542f70d67b51fdf97115ba473b7866c60
Author: Joe <joe@acme.com>
Date: Tue Dec 22 10:27:37 2020 +0300
added file with newline
"file\nwith\nnewline.txt"
commit 7a6f4cd0321d92c24e0b8051e8707d83b7d2fce0
Author: Joe <joe@acme.com>
Date: Tue Dec 22 10:26:27 2020 +0300
brief message
detailed message
first file.txt
second file.txt
commit ed4370fb6349f4209c0014c02900af17573d74a0
Author: Joe <joe@acme.com>
Date: Tue Dec 22 10:25:16 2020 +0300
root
因此,对于nuls,输出如下所示:
$ git log --name-only --pretty="tformat:%h%x00%an%x00%ci%x00%s" -z
4822fc1^@Joe^@2020-12-22 10:29:10 +0300^@Merge branch "dev"^@e9d6448^@Joe^@2020-12-22 10:28:35 +0300^@commit in side branch^@
some.txt^@7f74ea0^@Joe^@2020-12-22 10:27:37 +0300^@added file with newline^@
file
with
newline.txt^@7a6f4cd^@Joe^@2020-12-22 10:26:27 +0300^@brief message^@
first file.txt^@second file.txt^@ed4370f^@Joe^@2020-12-22 10:25:16 +0300^@root^@
请注意,无法删除格式化消息和文件列表之间的换行符
现在,如何区分文件和下一次提交?我想唯一的方法是使用一些神奇的字符串作为提交前缀:--pretty=“tformat:COMMITMAGIC%x00%h…。
Git for Windows附带了gawk和perl。为了简单起见,我更喜欢呆呆地看着。以下是最后的脚本:
git log --name-only --pretty="tformat:COMMITMAGIC%x00%h%x00%an%x00%ci%x00%s" -z | gawk -v RS="COMMITMAGIC." -v FS="\0" '
function esc(s) {
if (s ~ /[,"\n]/) s = "\"" gensub(/"/, "\"\"", "g", s) "\""
return s
}
/./ { # /./ skips first blank record
commonpart = esc($1) "," esc($2) "," esc($3) "," esc($4) ","
gsub(/^\n/,"",$5) # get rid of newline before file list
for (i=5;; i++) {
print commonpart esc($i)
if (i>=NF-1) break
}
}
'
回答#1
git日志输出的问题是,提交的某些字段可能包含CSV字段分隔符、换行符和引号。CSV要求这些值用双引号括起来“
,并且里面的引号应该重复:
aaa,"bbb1""bb
b2",ccc
git只能对文件名进行逃逸,但不能用于其他字段。请考虑此日志:
commit 4822fc186476b923e6a3a4758983898a4f799cdc (HEAD -> master)
Merge: 7f74ea0 e9d6448
Author: Joe <joe@acme.com>
Date: Tue Dec 22 10:29:10 2020 +0300
Merge branch "dev"
commit e9d644831f6c36a98f6868cde76ec2d259d5bc5c (dev)
Author: Joe <joe@acme.com>
Date: Tue Dec 22 10:28:35 2020 +0300
commit in side branch
some.txt
commit 7f74ea0542f70d67b51fdf97115ba473b7866c60
Author: Joe <joe@acme.com>
Date: Tue Dec 22 10:27:37 2020 +0300
added file with newline
"file\nwith\nnewline.txt"
commit 7a6f4cd0321d92c24e0b8051e8707d83b7d2fce0
Author: Joe <joe@acme.com>
Date: Tue Dec 22 10:26:27 2020 +0300
brief message
detailed message
first file.txt
second file.txt
commit ed4370fb6349f4209c0014c02900af17573d74a0
Author: Joe <joe@acme.com>
Date: Tue Dec 22 10:25:16 2020 +0300
root
因此,对于nuls,输出如下所示:
$ git log --name-only --pretty="tformat:%h%x00%an%x00%ci%x00%s" -z
4822fc1^@Joe^@2020-12-22 10:29:10 +0300^@Merge branch "dev"^@e9d6448^@Joe^@2020-12-22 10:28:35 +0300^@commit in side branch^@
some.txt^@7f74ea0^@Joe^@2020-12-22 10:27:37 +0300^@added file with newline^@
file
with
newline.txt^@7a6f4cd^@Joe^@2020-12-22 10:26:27 +0300^@brief message^@
first file.txt^@second file.txt^@ed4370f^@Joe^@2020-12-22 10:25:16 +0300^@root^@
请注意,无法删除格式化消息和文件列表之间的换行符
现在,如何区分文件和下一次提交?我想唯一的方法是使用一些神奇的字符串作为提交前缀:--pretty=“tformat:COMMITMAGIC%x00%h…。
Git for Windows附带了gawk和perl。为了简单起见,我更喜欢呆呆地看着。以下是最后的脚本:
git log --name-only --pretty="tformat:COMMITMAGIC%x00%h%x00%an%x00%ci%x00%s" -z | gawk -v RS="COMMITMAGIC." -v FS="\0" '
function esc(s) {
if (s ~ /[,"\n]/) s = "\"" gensub(/"/, "\"\"", "g", s) "\""
return s
}
/./ { # /./ skips first blank record
commonpart = esc($1) "," esc($2) "," esc($3) "," esc($4) ","
gsub(/^\n/,"",$5) # get rid of newline before file list
for (i=5;; i++) {
print commonpart esc($i)
if (i>=NF-1) break
}
}
'
如果提交有多个文件或零个文件,该怎么办?零个文件可以为空。但是,如果它有多个文件,我们可以有多个具有相同提交哈希值的行。对于#3,您可能需要一个perl脚本来从错误跟踪程序中检索此信息。如果提交有多个文件或零个文件,那么什么呢?零个文件可以为空。但是,如果它有多个文件,我们可以有多个具有相同提交hashfor#3的行,您可能需要一个perl脚本来从bugtracker检索此信息