Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/github/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
获取文件更改和bug问题的Git日志_Git_Github_Git Log - Fatal编程技术网

获取文件更改和bug问题的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存储库中更改的信息。我使用了以下命令:

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附带了gawkperl。为了简单起见,我更喜欢呆呆地看着。以下是最后的脚本:

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附带了gawkperl。为了简单起见,我更喜欢呆呆地看着。以下是最后的脚本:

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检索此信息