2017-01-16 96 views
0

我想git輸出格式爲status -s短狀態與他們的名字怪異的字符。混帳:</p> <pre><code>genesis% git status -s . ?? .config/aria2/ ?? .config/htop/ ?? .config/mc/ ?? .config/pacman/ ?? .config/remmina/ ?? .config/teamviewer/ ?? .config/zsh/ </code></pre> <p>但我想這個名單與' 0' 結尾的文件名安全與文件處理:用NULL結尾的名稱和相對路徑

genesis% git status -z . | xargs -0n1 echo 
?? misc/.config/aria2/ 
?? misc/.config/htop/ 
?? misc/.config/mc/ 
?? misc/.config/pacman/ 
?? misc/.config/remmina/ 
?? misc/.config/teamviewer/ 
?? misc/.config/zsh/ 

正如可以看到的,-z輸出給出相對於庫的根(附加misc)路徑。

我怎樣才能得到像第一個例子中的相對路徑名,但仍然有他們NUL - 終止?

回答

1

你不能直接得到你想要的東西。然而,由於-z代碼而不是人類用於消費,你可以加一點自己的代碼,做你想做的,使用git rev-parse --show-cdup

$ git rev-parse --show-cdup 
../ 

這是說有一個頂級組件當前工作目錄中的「缺失」,因此在通過-z獲得了限制到當前目錄條目之後,應刪除每個名稱的第一個組成部分。如果--show-cdup打印../../您需要剝去兩個,依此類推。

請注意,--show-cdup不會打印任何部分(更準確地說,是空行),因爲沒有組件可以剝離。因此,在--show-cdup的輸出中計算../(或甚至只是/)的數量可爲您提供正確數量的要剝離的前導路徑名稱組件。

(如果您提供比.git status其他一些說法,你需要更多的:測試參數是否是一個目錄,如果是這樣cd進去並運行git rev-parse --show-cdup,如果它是一個文件,獲取其dirname或.,cd,並運行git rev-parse --show-cdup。從子進程中執行所有這些操作以避免修改主進程的當前工作目錄。這種相當複雜的方法避免了必須編寫路徑名解析器來處理任意數量的./../組件,但是你也可以去其他路線,直接去realpath,假設POSIX-like環境。)

相關問題