Vinc3nt's Life

解決 Windows 下使用 git diff 產生的 Patch 編碼驗證問題

2024-11-17
develop
git
powershell
utf8
最後更新:2025-01-26
2分鐘
370字

記錄關於 git diff 產生 patch 檔的問題及解決過程

在使用 git diff 產生 patch 檔,發現應用時無法通過驗證,查看內容後也沒有發現任何可疑符號或問題。

即使是很簡單的改動,也無法通過驗證:

1
diff --git a/src/layouts/BlogPost.astro b/src/layouts/BlogPost.astro
2
index a910b96..81c4fbc 100644
3
--- a/src/layouts/BlogPost.astro
4
+++ b/src/layouts/BlogPost.astro
5
@@ -9,6 +9,7 @@ import {comment, config} from "../consts";
6
import ScrollToTop from '../components/ScrollToTop.astro'
7
import {t}from '../i18n/utils'
8
9
+const a = 'askjldfjlkasjfdklajsdlkfjsajdfljaslkfjlsajdlf'
10
const {frontmatter = {comment: false, donate: false, toc: false, mathjax: false, mermaid: false}} = Astro.props
11
---

但是如果應用 GenAI 產生的 patch 範例,卻沒有問題:

1
diff --git a/src/components/BaseHead.astro b/src/components/BaseHead.astro
2
index 2798b8e..9bce191 100644
3
--- a/src/components/BaseHead.astro
4
+++ b/src/components/BaseHead.astro
5
@@ -3,7 +3,12 @@ import '../styles/index.css'

想到之前都是透過 WSL 執行 git 指令,因此懷疑可能是因為編碼或是 Windows 和 Linux 之間的換行符號差異導致的問題。

對照組實驗

原始 git 指令

Terminal window
1
git diff HEAD -- src/layouts/BlogPost.astro > patches/ori_blog.patch

強制轉換 utf8 指令

Terminal window
1
git diff HEAD -- src/layouts/BlogPost.astro | Set-Content -Encoding utf8 patches/blog.patch

可以看到兩個檔案的大小不同,這進一步證實了它們的編碼存在差異。

default

用 notepad++ 分別打開檔案,兩者的編碼也是不一樣的

default

default

使用 blog.patch 檔案驗證成功。

結論

在使用 Windows 作業系統時,需要警覺編碼問題或換行符號差異可能會導致 git patch 驗證失敗。由於 git 對於 patch 的編碼格式有特定要求,強制使用 UTF-8 可以確保所有符號被正確識別,從而避免驗證失敗。

Reference

本文標題:解決 Windows 下使用 git diff 產生的 Patch 編碼驗證問題
文章作者:Vincent Lin
發布時間:2024-11-17