簡體   English   中英

將 git 日志文件名解析為 json

[英]Parse git log file names to json

我使用以下代碼來獲取在上次提交中更改的文件的名稱:

git log -1 --stat

現在我想將結果解析為 JSON。 我知道我可以使用漂亮格式將所有“git log”數據解析為 JSON(漂亮格式),如下所示:

git log \
--pretty=format:'{%n  "commit": "%H",%n  "author": "%an <%ae>",%n  "date": "%ad",%n  "message": "%f"%n},' \
$@ | \
perl -pe 'BEGIN{print "["}; END{print "]\n"}' | \
perl -pe 's/},]/}]/'

但是有沒有辦法也解析這個 JSON 更改文件名

您可以執行以下操作:

function getcommit { \
    git show --pretty="format:"  --name-only $1 | \
    perl -pe's/^\n//g;' | \
    sed 's/\(.*\)/"\1"/g' | \
    perl -0pe 's/\n(?!\Z)/,\n/g'; \
}

export -f getcommit

git log -1 --pretty=format:'{%n  "commit": "%H",%n  "author": "%an <%ae>",%n  "date": "%ad",%n  "message": "%f",%n  "files": [ COMMIT_HASH_%H  ]%n},' | \
perl -pe 'BEGIN{print "["}; END{print "]\n"}' | \
perl -pe 's/},]/}]/;s/COMMIT_HASH_(\w+)/`echo -n "";getcommit $1`/e'

基本上,我用哈希本身之前的固定字符串COMMIT_HASH_替換了提交哈希,然后用git show --pretty="format:" --name-only $COMMIT_HASH的結果替換了這個哈希。

所有更改的文件都放入一個 json 數組“文件”中。 這適用於最后一次 X 提交

這是最后一次提交的示例:

[{
  "commit": "1edcef90b42afee11fbd31dcc458ae0f15a3bb6e",
  "author": "Bertrand Martel <......@gmail.com>",
  "date": "Tue Oct 13 17:35:34 2015 +0200",
  "message": "update-readme",
  "files": [ "README.md",
"device.png",
"screenshot.png"
  ]
},
{
  "commit": "8aa2ce64e58b770122a3561b8ef41d807ce36abc",
  "author": "Bertrand Martel <......@gmail.com>",
  "date": "Mon Oct 12 19:36:18 2015 +0200",
  "message": "fix-async-bluetooth-command-bug-bluetoooth-state-check",
  "files": [ "android/app/src/main/java/fr/bmartel/android/bluetooth/BluetoothCustomManager.java",
"android/app/src/main/java/fr/bmartel/android/bluetooth/GattTask.java",
"android/app/src/main/java/fr/bmartel/android/bluetooth/GattUtils.java",
"android/app/src/main/java/fr/bmartel/android/bluetooth/IBluetoothCustomManager.java",
"android/app/src/main/java/fr/bmartel/android/bluetooth/IBluetoothManagerEventListener.java",
"android/app/src/main/java/fr/bmartel/android/bluetooth/ICharacteristicListener.java",
"android/app/src/main/java/fr/bmartel/android/bluetooth/IDevice.java",
"android/app/src/main/java/fr/bmartel/android/bluetooth/IDeviceInitListener.java",
"android/app/src/main/java/fr/bmartel/android/bluetooth/IScanListListener.java",
"android/app/src/main/java/fr/bmartel/android/bluetooth/connection/BluetoothDeviceAbstr.java",
"android/app/src/main/java/fr/bmartel/android/bluetooth/connection/BluetoothDeviceConn.java",
"android/app/src/main/java/fr/bmartel/android/bluetooth/connection/IBluetoothDeviceConn.java",
"android/app/src/main/java/fr/bmartel/android/bluetooth/listener/IPushListener.java",
"android/app/src/main/java/fr/bmartel/android/bluetooth/notti/INottiDevice.java",
"android/app/src/main/java/fr/bmartel/android/bluetooth/notti/INottiListener.java",
"android/app/src/main/java/fr/bmartel/android/bluetooth/notti/NottiDevice.java",
"android/app/src/main/java/fr/bmartel/android/bluetooth/shared/ActionFilterGatt.java",
"android/app/src/main/java/fr/bmartel/android/bluetooth/shared/ISharedActivity.java",
"android/app/src/main/java/fr/bmartel/android/bluetooth/shared/LeDeviceListAdapter.java",
"android/app/src/main/java/fr/bmartel/android/notti/NottiActivity.java",
"android/app/src/main/java/fr/bmartel/android/notti/NottiBtService.java",
"android/app/src/main/java/fr/bmartel/android/notti/NottiDeviceActivity.java"
  ]
}]

這是一個腳本,它在參數中獲取提交索引並返回 json 信息,包括更改的文件: https : //gist.github.com/bertrandmartel/a4ed5d76562e74d77282

代替困難的正則表達式和自定義 Bash 函數,您可以使用 (一個真正的 JSON 解析器)從 1 個git -command 創建 JSON 數組。

為了說明,我將從FFmpeg repo 中獲取最新的 3 次提交。

$ git log -3 --pretty=format:'%H%n%an <%ae>%n%ad%n%f' --name-only
cf12a478b206cd107343827426a05aedb83816bc
Thilo Borgmann <thilo.borgmann@mail.de>
Sun Jun 6 15:15:50 2021 +0200
fftools-cmdutils.c-Add-cmd-line-option-to-override-detection-of-cpu-count
doc/fftools-common-opts.texi
fftools/cmdutils.c
fftools/cmdutils.h

87951dcbe775b349a671b9ac2e6ac5c38aee0e79
Thilo Borgmann <thilo.borgmann@mail.de>
Sun Jun 6 15:15:00 2021 +0200
lavu-cpu.c-Add-av_force_cpu_count-to-override-auto-detection
libavutil/cpu.c
libavutil/cpu.h

b7266302a40ba48fea7a5644f08623159b3dcac7
Keyun Tong <ktong@fb.com>
Sun Jun 20 21:42:29 2021 +0200
fftools-ffmpeg-Add-new-variant-source_no_drop-to-the-force_key_frames-option
doc/ffmpeg.texi
fftools/ffmpeg.c
fftools/ffmpeg.h

$ git log -3 --pretty=format:'%H%n%an <%ae>%n%ad%n%f' --name-only | xidel -se '
  array{
    for $cmt in tokenize($raw,"\n\n")
    let $ln:=x:lines($cmt)
    return {
      "commit":$ln[1],
      "author":$ln[2],
      "date":$ln[3],
      "message":$ln[4],
      "files":array{$ln[position() = 5 to last()]}
    }
  }
'
[
  {
    "commit": "cf12a478b206cd107343827426a05aedb83816bc",
    "author": "Thilo Borgmann <thilo.borgmann@mail.de>",
    "date": "Sun Jun 6 15:15:50 2021 +0200",
    "message": "fftools-cmdutils.c-Add-cmd-line-option-to-override-detection-of-cpu-count",
    "files": ["doc/fftools-common-opts.texi", "fftools/cmdutils.c", "fftools/cmdutils.h"]
  },
  {
    "commit": "87951dcbe775b349a671b9ac2e6ac5c38aee0e79",
    "author": "Thilo Borgmann <thilo.borgmann@mail.de>",
    "date": "Sun Jun 6 15:15:00 2021 +0200",
    "message": "lavu-cpu.c-Add-av_force_cpu_count-to-override-auto-detection",
    "files": ["libavutil/cpu.c", "libavutil/cpu.h"]
  },
  {
    "commit": "b7266302a40ba48fea7a5644f08623159b3dcac7",
    "author": "Keyun Tong <ktong@fb.com>",
    "date": "Sun Jun 20 21:42:29 2021 +0200",
    "message": "fftools-ffmpeg-Add-new-variant-source_no_drop-to-the-force_key_frames-option",
    "files": ["doc/ffmpeg.texi", "fftools/ffmpeg.c", "fftools/ffmpeg.h"]
  }
]
  • 通過在空行上“標記化”來創建每個提交的序列。
  • 對於每次提交,創建一個變量來保存每一行的序列。
    x:lines($cmt)tokenize($cmt,'\\r\\n?|\\n')的簡寫)
  • 從每個對應的行返回 JSON 對象,其中文件列表變成了從第 nr.5 行到最后一行的數組。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM