在試圖回答this question我做了一個乾淨的過濾器,設置.sh
文件的可執行位,並被其結果困惑。爲什麼這個乾淨的過濾器在第一次運行時被忽略?
首先,我跑了git config filter.executable.clean 'chmod +x %f'
。這增加了下面的內容,我的測試存儲庫的.git/config
文件:
[filter "executable"]
clean = chmod +x %f
接下來,我創建了一個.gitattributes
文件:
*.sh filter=executable
讓我們來看看如何行爲。當然,新創建的.sh
文件不是可執行文件:
$ touch foo.sh
$ ls -l foo.sh
-rw-r--r-- foo.sh
如果我們add
是我們的清潔過濾器應該運行。但是這會導致我們的工作目錄中有一個可執行文件,我們的臨時區域中有一個不可執行的文件,以及髒的工作副本!
$ git add foo.sh
$ ls -l foo.sh
-rwxr-xr-x foo.sh
$ git ls-files -s foo.sh
100644 foo.sh
$ git status
Changes to be committed:
new file: foo.sh
Changes not staged for commit:
modified: foo.sh
運行git add
再次導致在臨時區域的可執行文件和一個乾淨的工作拷貝:
$ git add foo.sh
$ git ls-files -s foo.sh
10755 foo.sh
$ git status
Changes to be committed:
new file: foo.sh
這是怎麼回事?