簡體   English   中英

包含混合編碼文件的現有 Git 存儲庫

[英]Existing Git repository with files in mixed encodings

我有一個現有的存儲庫,其中包含混合編碼的文件 - 有些文件是 UTF-8,有些是 ANSI(例如 Windows-1252)。 大多數情況下一切正常,除了我厭倦了在對 ANSI 文件執行差異時看到“無效字符”,而且我特別惱火的是我不能使用我的 GUI 工具來暫存或取消暫存這些字符的大塊頭。 我正在尋找一種方法來說服 Git,某個文件使用非 UTF-8 編碼,這樣 Git 將首先執行轉換,然后對其施展魔法。

據我所知,有兩種方法可以實現結果:

自定義二進制到文本過濾器

  1. 向我的 .gitconfig 添加轉換過濾器:
    [diff "win1252"]
    textconv = "iconv -f windows-1252 -t utf-8"
  1. .gitattributes ,將文件標記為二進制文件並請求使用此過濾器將其轉換為文本:
    *.txt    diff=win1252

這種方法在孤立的git diff似乎工作正常,但我遇到了幾個我不知道如何解決的問題:

  1. 即使使用core.autocrlf = true ,這種方法也不會對轉換命令的輸出執行 CRLF 轉換,因此我的差異將顯示更改行中的行尾差異。 我可以創建一個腳本來運行 iconv 來執行編碼轉換,然后將輸出傳遞給將執行 EOL 轉換的 dos2unix,但它似乎相當笨拙。
  2. 由於外部工具的使用非常頻繁,我遇到了顯着的減速。
  3. 似乎命令行和我的 GUI (SourceTree) 在登台時都不尊重轉換設置。 git add -p顯示垃圾(甚至比“未知字符”更糟糕)並且 SourceTree 停止暫存並顯示無法找到原始文本的錯誤消息。

雖然我可能能夠學會忍受 #1 和 #2,但 #3 是一個阻塞問題,因為我主要需要完成此轉換以促進其中包含“未知字符”的大塊頭的暫存。 我當前的工作流程,我使用git add -p而不進行任何轉換,可能會顯示“未知字符”,但至少它有效。

對 GUI 進行不切實際的更改:我嘗試過的所有其他 GUI 都有比這更嚴重的問題。

使用工作樹編碼屬性

  1. .gitattributes ,將文件標記為具有自定義編碼的文本文件:
    *.txt    text working-tree-encoding=windows-1252

據我所知,這種方法涵蓋了上面列出的所有抱怨,並且在命令行和 GUI 中都可以正常工作。 不幸的是,有一個主要的警告:它僅適用於在設置此屬性后創建的文件。 對於在添加此屬性之前創建的文件,Git 將為包含這些未編碼字符的每個文件顯示更改(從“未知字符”到 windows-1252)。 此外,在克隆存儲庫后,它會抱怨它“無法將 'a.txt' 從 UTF-8 編碼到 windows-1252”。 似乎該文件實際上已正確克隆(與原始文件逐字節匹配),但它仍然顯示出差異。 基本上,我將不得不提交帶有“未知字符”的每個文件,以便在存儲庫中將其重新編碼為 UTF-8,這會導致我的歷史記錄陷入困境,並且幾乎使 Blame 無法使用。

看來,一個現實的辦法可能是使用像git filter-branch ,而是為整個存儲庫(有什么樣的?)對所有現有文件轉換為UTF-8屬性添加到最初的承諾,但我擔心做這么大的事情。 此外,我希望我會丟失之前的提交 ID,這將是不幸的(我用提交 ID 標記我的可執行文件以輕松定位它們的構建版本)。


有沒有辦法克服所描述方法的缺點,或者是否有另一種方法不會受到它們的影響?

通過使用working-tree-encoding ,您走在正確的軌道上,但您還需要一步。

在創建.gitattributes文件的同一個提交中,運行git add --renormalize . ,它將獲取所有工作樹文件並根據指定的編碼對其進行過濾。 然后,您需要在同一提交中提交所有更改的文件和.gitattributes文件,此后它們將作為 UTF-8 存儲在 repo 中,但在您的工作樹中為 Windows-1252。

這確實有一個缺點,即git blame將不得不跳回到該提交之外,但是您可以指定--ignore-rev--ignore-revs-file (或配置選項blame.ignoreRevsFile )來忽略該修訂,以及所有內容將工作。

暫無
暫無

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

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