2016-02-15 35 views
18

儘管這些文件位於.gitignore文件中,但我的開發團隊中的人員仍在繼續將構建特定文件(node_modules和其他文件)推送到我們的回購站,可能與git add --all -f或其他相關內容有關。什麼是比.gitignore更強大的方式來保持(強制)文件回購嗎?

這是一個巨大的痛苦,讓人們停止這樣做是困難的。

是否有某種方法可以使某些文件無法推送到回購站點?

+0

你使用的是類似GitHub的東西嗎?您使用什麼來託管存儲庫? –

+20

打敗你的同事,直到他們明白他們不應該提交不適當的文件。 –

+0

@DavidDeutsch這可能是下一步 –

回答

30

有什麼辦法可以使某些文件無法推送到回購站點嗎?

是的,你可以使用像這樣的鉤子來防止提交多個文件。

pre-receive hook

#!/bin/sh 

# Check to see if this is the first commit in the repository or not 
if git rev-parse --verify HEAD >/dev/null 2>&1 
then 
    # We compare our changes against the previous commit 
    against=HEAD^ 
else 
    # Initial commit: diff against an empty tree object 
    against=4b825dc642cb6eb9a060e54bf8d69288fbee4904 
fi 

# Redirect output to screen. 
exec 1>&2 

# Check to see if we have updated the given file 
if [ $(git diff-tree -r --name-only $against | grep <ANY FILE YOU WANT TO FIND OUT HERE>) ]; 
then 

    # Output colors 
    red='\033[0;31m'; 
    green='\033[0;32m'; 
    yellow='\033[0;33m'; 
    default='\033[0;m'; 

    # personal touch :-) 
    echo "${red}" 
    echo "           " 
    echo "     |ZZzzz    " 
    echo "     |      " 
    echo "     |      " 
    echo "  |ZZzzz  /^\   |ZZzzz " 
    echo "  |   |~~~|   |  " 
    echo "  |  |-  -|  /\  " 
    echo "  /^\  |[]+ |  |^^^|  " 
    echo " |^^^^^^^| | +[]|  | |  " 
    echo " | +[]|/\/\/\/\^/\/\/\/\/|^^^^^^^| " 
    echo " |+[]+ |~~~~~~~~~~~~~~~~~~| +[]| " 
    echo " |  | [] /^\ [] |+[]+ | " 
    echo " | +[]+| [] || || [] | +[]+| " 
    echo " |[]+ |  || ||  |[]+ | " 
    echo " |_______|------------------|_______| " 
    echo "           " 
    echo "           " 
    echo "  ${green}You have just committed code " 
    echo "  ${red}Your code ${yellow}is bad.!!!  " 
    echo "  ${red} Do not ever commit again " 
    echo "           " 
    echo "${default}" 
fi; 

# set the exit code to 0 or 1 based upon your needs 
# 0 = good to push 
# 1 = exit without pushing. 
exit 0; 

注:

Github上不支持以這種方式使用掛鉤。
他們有自己的WebHooks

在這種情況下,你也可以使用鉤子,但在客戶端。
相同的代碼可以放在pre-commit鉤子上客戶端

+1

爲了達到這個目的,這不一定要安裝在服務器上嗎?這在我看來有點太花哨...... –

+2

客戶端鉤子的問題是你可以刪除它們(用戶)。在服務器端只有git admin可以改變它們 – CodeWizard

+0

是的,但這也意味着你必須訪問服務器本身;如果代碼是由像Github這樣的服務託管的,那麼他們將無法獲得像這樣的鉤子。 –

0

這不是一個容易解決的問題,因爲git是分佈式的。

服務器端過濾器像後置提交鉤子(或提交過濾器插件,如果你使用的是藏匿處)允許用戶陷入混亂,這是不是很好。

客戶端預先提交的鉤子更清潔,因爲它可以防止用戶污染他們的回購,但是這個解決方案不是防彈的。

您可以從另一個角度來處理問題,並將構建工件和中間文件移出您的存儲庫目錄。

相關問題