我嘗試使用以下命令計算作者“JohnJohnson”提交給 git 的字符:
wc -m $(git log --use-mailmap --no-merges --author="JohnJohnson" --name-only --pretty=format:"" | sort -u)
問題是在 Linux 和 Windows(git-bash) 上它會產生不同的結果,至少因為在 Windows 上新行由兩個字符'\r\n'組成。有沒有辦法讓 wc -m 忽略 '\r' 以便我在兩個作業系統上使用相同的命令獲得一致的結果?
uj5u.com熱心網友回復:
注意:雖然在運行dos2unix之前在每個檔案上運行wc -m就足夠了,但我假設 a)dos2unix不可用和/或 b) OP 可能會發現還有其他字符(除了\r)需要洗掉。
假設目的是產生完全相同的輸出作為wc -m使用用戶定義的函式,一個想法:
my_wc () {
local charcount=0 totcount=0
for fname in $@
do
charcount=$(tr -d '\r' < $fname | wc -m)
echo "$charcount $fname"
((totcount =charcount))
done
echo "$totcount total"
}
應用于 OP 的示例:
my_wc $(git log --use-mailmap --no-merges --author="JohnJohnson" --name-only --pretty=format:"" | sort -u)
如果 OP 發現\r要跳過的其他字符(除了),則將它們添加到tr -d '\r'呼叫中)。
另一個功能想法,但這個使用awk:
my_wc() {
awk 'BEGIN { RS="^$" } # whole file becomes one single, long record
{ gsub("\r","")
n=length($0)
tot =n
print n,FILENAME
}
END { print tot,"total"}' $@
}
在幾個示例檔案上演示這些功能:
$ head f?
==> f1 <==
a 13
a 5
b 7
a 20
a 3
==> f2 <==
a 13
a 5
b 7
a 20
a 3
==> f3 <==
a 13
a 5
b 7
a 20
a 3
$ dos2unix f?
$ wc -m f?
22 f1
22 f2
22 f3
66 total
$ unix2dos f?
$ wc -m f?
27 f1
27 f2
27 f3
81 total
$ my_wc f?
22 f1
22 f2
22 f3
66 total
uj5u.com熱心網友回復:
在配置為在您的作業樹中不執行換行符轉換的存盤庫中操作,即eol關閉處理。你可以在任何地方做這件事,比如說git config core.eol false。避免干擾的最簡單方法可能是在臨時克隆中執行此操作,
git clone -ns . `mktemp -d`; cd $_
git config core.eol false
git checkout
現在您有了一個沒有應用 eol munging 的原始結帳。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/409100.html
標籤:
上一篇:如何縮進git-clone的輸出
