2017-10-20 278 views
0

我想爲所有.cpp文件設置代碼樣式格式,然後它們被提交給git。使用過濾器污跡/乾淨的git屬性通過shell腳本處理.cpp文件沒有找到文件名

我做了小腳本(名爲codeformat)要做到這一點,(還試圖replaing以$ 1%F)

#! /bin/bash 
clang-format -style=file %f | diff %f -** 
if [ $? -ne 0 ]; then 
    echo "ERROR: codeformat not correct" 
    exit 1 
fi 

沒有設置混帳配置,帶*號的.cpp過濾= codeformat更新.gitattributes,

git config --global filter.codeformat.clean codeformat 
git config --global filter.codeformat.smudge codeformat 

看起來像腳本正在運行,但它沒有獲取文件名。爲什麼是這樣?

回答

1

您在錯誤的地方有%f指令。

the gitattributes documentation所示(搜索%f):

Sequence "%f" on the filter command line is replaced with the name of the file the filter is working on. A filter might use this in keyword substitution. For example:

[filter "p4"] 
     clean = git-p4-filter --clean %f 
     smudge = git-p4-filter --smudge %f 

因此,要獲得文件的路徑名,您將需要filter.codeformat.clean設置,例如,以codeformat %f

此時你還需要修改你的bash腳本,因爲語法參數替換確實$1。然而,讀取來自gitattributes文檔緊跟其後的段落:

Note that "%f" is the name of the path that is being worked on. Depending on the version that is being filtered, the corresponding file on disk may not exist, or may have different contents. So, smudge and clean commands should not try to access the file on disk, but only act as filters on the content provided to them on standard input.

這裏要強調的是我的,但是這是告訴你,你不能簡單地打開磁盤文件,讀取它。您只能過濾標準輸入,提供標準輸出。

As it turns out, clang-format is designed to do just that.差異,但是,是不是。)


編輯補充工作示例:

$ cat ~/scripts/dotest 
#! /bin/sh 
echo "dotest run with $# arguments:" >>/tmp/dotest_log 
for i do 
    printf '%s\n' "$i" 
done >>/tmp/dotest_log 
cat 
$ which dotest 
[path edited]/scripts/dotest 
$ cat .git/config 
[core] 
     repositoryformatversion = 0 
     filemode = true 
     bare = false 
     logallrefupdates = true 
[filter "testfilter"] 
     clean = dotest %f 
     smudge = dotest %f 
$ cat .gitattributes 
*.test filter=testfilter 
$ echo 'bar.test' > bar.test 
$ git add bar.test 
$ cat /tmp/dotest_log 
dotest run with 1 arguments: 
bar.test 
+0

看到添加工作的例子。我不知道你做了什麼不同,但我的腳本調用文件名稱,如/ tmp中的日誌文件所示。 – torek

+0

這有幫助,早些時候我錯過了運行git config,我運行git config --global,但是我必須單獨運行「git config」,而不需要全局性地在.git/config中更新它,否則它只會更新〜/。 gitconfig。現在,它打印文件名,我現在需要使用我的代碼格式命令。 – Ramana

+0

我們可以寫屏幕錯誤信息嗎?讓我們說從/ tmp/dotest_log的內容,wehn我觸發git add?我有一些回聲命令,而不是重定向到日誌,它不寫日誌,它只給出消息錯誤過濾器...目標是給一些消息,所以用戶可以遵循,此外,腳本退出內部腳本不退出Git操作,我的Git即使腳本失敗,添加仍然成功 - 我們可以強制它失敗git add直到它們修復嗎? – Ramana

0

%fgit解釋,並應在gitconfig。在shell腳本中使用$1

git config --global filter.codeformat.clean 'codeformat %f' 
git config --global filter.codeformat.smudge 'codeformat %f' 

#! /bin/bash 
clang-format -style=file $1 | diff $1 -** 
if [ $? -ne 0 ]; then 
    echo "ERROR: codeformat not correct" 
    exit 1 
fi 
+0

我也嘗試過,沒有幫助,請參閱下面的更多細節。 – Ramana

0

這意味着,我永遠無法得到的文件名?我試過%F與混帳配置本身並改變腳本中使用$ 1,它仍然沒有得到文件名。

cat ~/.gitconfig 

[filter "codeformat"] 
     clean = codeformat %f 
     smudge = codeformat %f 

cat .gitattributes 
    #clang code style format 
    *.cpp       filter=codeformat 

cat codeformat 
    #! /bin/bash 
    clang-format -i -style=file $1 - 
    echo "file/path accessed is _____ $1 ____" > log_output 2>&1 

git add src/sample.cpp 

    cat log_output 
    file/path accessed is _____ ____ 

相同的命令(下圖),如果我在命令行中運行效果良好,

clang-format -i -style=file src/sample.cpp 

使用Git添加它不能獲取文件名,因此其他錯誤與 錯誤:讀取時無法使用-i來自stdin。

注意到這個時候,我刪除diff命令,使用-i來代替直接的源文件」

相關問題