liunx ssh命令詳解
我們將開始學習如何構建一個Git服務器,如何在具體的事件中寫一個針對特定的觸發(fā)操作的自定義Git(例如通告),如何發(fā)布你的代碼到一個網站。接下來是小編為大家收集的liunx ssh命令詳解,歡迎大家閱讀:
liunx ssh命令詳解
目前為止,用戶對Git的焦點主要在Git的使用上。這篇文章中,我將論述如何管理Git以及自定Git架構的設計。你可能會覺得這聽起來像“先進的Git技術”或者“如果你是學霸讀這篇文章”的委婉說法,但是事實上理解Git如何工作不需要任何的高深知識或者專業(yè)培訓,在一些情況下只需要了解一點Linux。分享Git服務
創(chuàng)建自己的Git服務共享非常簡單, 在許多情況下值得去創(chuàng)建這樣一個Git服務。它不僅保證你隨時可以訪問你的代碼,它的無限制數據存儲、持續(xù)集成跟部署同時為個人Git管理打開了一道Git延伸與拓展的大門。
假如你知道如何使用Git和SSH,那么你已經知道如何創(chuàng)建一個Git服務器了。設計Git的方式,你創(chuàng)建或者克隆一個倉庫時,你已經創(chuàng)建了一半服務器。使能SSH訪問倉庫,并且任何訪問你倉庫的人都可以使用你的回購協(xié)議作為一個新克隆的基礎。
但是,會有一個小特設。有些計劃你可以構建關于同樣數量的精心設計的Git服務器,但是可以具有更好擴展性。
首先是:識別你的用戶,包括閑雜與未來的。假如你是唯一用戶,那么無需任何改變,但是如果你邀請國外的貢獻者了,那么你應該為開發(fā)者搭建一個貢獻共享系統(tǒng)平臺。
假定你有一個可用的服務器(如果不是,Git無法解決這個問題,但是運行在Raspberry Pi 3 的CentOS將會是一個良好開端),第一步是采用SSH鍵值授權登錄,它比密碼登錄更加強大,因為它能免疫于蠻力攻擊,并且可以避免用戶盡可能簡單地刪除它們的鍵值。
在你啟用了SSH密鑰認證之后,就創(chuàng)建一個 gituser用戶。這是一個提供給所有通過了認證的用戶的共享用戶賬號:
1$ su -c 'adduser gituser'
然后切換到這個用戶,并使用合適的權限創(chuàng)建一個 ~/.ssh 框架。這非常重要,因為如果權限設置太過于隨意,你自己針對SSH的防護默認就會失效。
1$ su - gituser
2$ mkdir .ssh && chmod 700 .ssh
3$ touch .ssh/authorized_keys
4$ chmod 600 .ssh/authorized_keys
authorized_keys 文件里面有所有你賦予其權限操作你的Git工程的開發(fā)者的SSH公共密鑰。你的開發(fā)者必須創(chuàng)建屬于他們自己的SSH密鑰并將其中的公共密鑰發(fā)送給你。要把這些公共密鑰復制到gituser的 authorized_keys 文件中去。例如,對于一個叫做Bob的開發(fā)者,可以運行這些命令:
1$ cat ~/path/to/id_rsa.bob.pub >> \
2/home/gituser/.ssh/authorized_keys
當開發(fā)者Bob持有能匹配他發(fā)送給你的公共密鑰的私有密鑰時,他就能以gituser訪問服務器。
不過,你并不會真的想讓你的開發(fā)者訪問到服務器,即使只是以gituser用戶來進行訪問。你想要的是讓他們只能訪問到Git資源庫。因為這個原因,Git提供了一個受限的shell,恰如其分的將其稱為 git-shell、以root用戶運行下面的這些命令可以將git-shell添加到你的系統(tǒng)中,并使其成為gituser用戶的默認shell:
1# grep git-shell /etc/shells || su -c \
2"echo `which git-shell` >> /etc/shells"
3# su -c 'usermod -s git-shell gituser'
現在gituser只能使用SSH來向Git資源庫進行推送和拉取操作,而不能訪問到一個登陸shell。你應該將你自己加入gituser對應的用戶組,在我們的示例服務器中它還是gituser。
例如:
1# usermod -a -G gituser seth
剩下的唯一一個步驟就是創(chuàng)建一個Git資源庫。因為不會有人在服務器上跟它進行直接交互(也就是說你不會通過SSH連上服務器然后直接在資源庫中進行操作), 這使其成為了一個基礎的資源庫。如果你想要把服務器上的資源庫用起來,就要將其從它所在的地方克隆到自己的home目錄中去。
嚴格來說,你并不用使其成為一個基礎資源庫,它還是可以作為一個普通的資源庫來操作的。不過,一個基礎資源庫是沒有*工作樹(working tree)* (也就是說,不會有分支會處在”checkout“狀態(tài))。這很重要,因為遠程用戶不會被允許向一個活動分支進行推送 (你是不會想在一個”dev“分支工作時突然有人將變更推送到你的工作空間的?)。因為基礎資源庫不能有活動分支,那就不會有問題發(fā)生了。
你可以將資源庫放到任何你想要放置的地方, 只要你想賦予權限的用戶和組也能訪問到它就行了。你不會想將目錄存儲到一個用戶的home目錄的,因為這里的權限相當地嚴格, 而是要放在一個通用共享的位置,例如 /opt or /usr/local/share.
以root用戶創(chuàng)建一個基礎資源庫:
1# git init --bare /opt/jupiter.git
2# chown -R gituser:gituser /opt/jupiter.git
3# chmod -R 770 /opt/jupiter.git
現在任何已gituser認證的、或者是位于gituser分組的用戶都可以讀取和寫入jupiter.git資源庫。你可以在自己本機上試試看:
1$ git clone gituser@example.com:/opt/jupiter.git jupiter.clone
2Cloning into 'jupiter.clone'...
3Warning: you appear to have cloned an empty repository.
記?。洪_發(fā)有必須讓他們的公共SSH密鑰導入gituser用戶的 authorized_keys 文件, 或者是擁有服務器上面的賬戶(就像你一樣), 那樣的話他們就必須是gituser組的成員。
Git鉤子
運行你自己的Git服務器帶來的一個好處是它提供了Git鉤子。Git托管服務有時也提供了一個類似鉤子的接口,但那并不是真正的可以訪問文件系統(tǒng)的Git鉤子。一個Git鉤子是一個腳本,它在Git進程中的某個時刻執(zhí)行。在一個倉庫(repository)接受一個提交(commit)之前,或者收到一個提交之后,或者接收一個推送(push)之前,或者收到一個推送之后等時刻執(zhí)行一個鉤子。
這個系統(tǒng)很簡單:任何可執(zhí)行的腳本都存放在.git/hooks目錄中,使用標準的命名方案,并且在某個指定的時刻執(zhí)行。腳本執(zhí)行的時間由名字來決定;pre-push腳本在推送之前執(zhí)行,post-receive腳本在收到一個提交之后執(zhí)行,諸如此類。它基本上屬于自文檔(self-documenting)。
可以使用任何語言編寫鉤子腳本;如果你能在你的系統(tǒng)上運行某種語言的hello world腳本,那么你就可以使用那門語言來編寫Git鉤子腳本。默認情況下,Git附帶了一些范例,但沒有啟用。
想要運行一個腳本嗎?使用起來很簡單。如果你還沒有Git倉庫的話,首先創(chuàng)建一個。
1$ mkdir jupiter
2$ cd jupiter
3$ git init .
然后編寫一個"hello world" Git鉤子。由于在工作中我為了傳統(tǒng)支持而使用tcsh,所以我堅持使用它作為我的腳本語言,但你可以自由地選用你喜愛的語言(Bash、Python、Ruby、Perl、Rust、Swift、Go):
1$ echo "#\!/bin/tcsh" > .git/hooks/post-commit
2$ echo "echo 'POST-COMMIT SCRIPT TRIGGERED'" > \
3~/jupiter/.git/hooks/post-commit
4$ chmod +x ~/jupiter/.git/hooks/post-commit
現在進行測試:
1$ echo "hello world" > foo.txt
2$ git add foo.txt
3$ git commit -m 'first commit'
4! POST-COMMIT SCRIPT TRIGGERED
5[master (root-commit) c8678e0] first commit
61 file changed, 1 insertion(+)
7create mode 100644 foo.txt
這就是你的第一個可以正常運行的Git鉤子。
著名的推送到web 鉤子
一個流行的Git鉤子用法是自動推送改變部分到工作生產中的web服務器目錄。這是一個偉大構建FTP的方式,保留開發(fā)環(huán)節(jié)的全版本控制,并且整合、自動化發(fā)布內容。
如果正確執(zhí)行,它將會工作運行良好,在某一種程度來說,一直應該做的是考慮如何網絡發(fā)布。它是不錯的。我不知道最初是誰想出這主意的,但是我第一次是從EMacs和來自IBM公司的Git-mentor、Bill Von Hagen那里聽到的。他的文章仍然是對這個過程起決定性作用的介紹:Git 改變分布式Web開發(fā)規(guī)則。
Git變量
每個Git鉤子獲取一組不同的Git動作觸發(fā)它的相關變量。你可能會用到這些變量,也可能用不到。這取決于你所寫的作品。 如果你想要的是一個普通的郵件來通知你,有人推了東西。那么你不需要細節(jié),也不需要腳本,因為你可以套用現有的樣板。如果你想在郵件里瀏覽別人提交的信息和作者,那么對你的腳本要求更高。
Git鉤子并不是用戶直接運行的,所以要理解透如何獲取這些混亂卻重要的信息。事實上,一個Git鉤子腳本與其他任何腳本類似,像BASH、Python、C++或者其他腳本一樣的方式接受來自stdin的參數。不同的是,我們不會提供自己入參,所以使用它時要弄清楚你想要的是什么(參數)。
編寫一個Git鉤子之前,可以進入到你的項目目錄.git/hooks查看Git提供的范例。例如,下面是pre-push.sample文件的注釋部分:
1# class="main">
liunx ssh命令詳解
2#
我們將開始學習如何構建一個Git服務器,如何在具體的事件中寫一個針對特定的觸發(fā)操作的自定義Git(例如通告),如何發(fā)布你的代碼到一個網站。接下來是小編為大家收集的liunx ssh命令詳解,歡迎大家閱讀:
liunx ssh命令詳解
目前為止,用戶對Git的焦點主要在Git的使用上。這篇文章中,我將論述如何管理Git以及自定Git架構的設計。你可能會覺得這聽起來像“先進的Git技術”或者“如果你是學霸讀這篇文章”的委婉說法,但是事實上理解Git如何工作不需要任何的高深知識或者專業(yè)培訓,在一些情況下只需要了解一點Linux。分享Git服務
創(chuàng)建自己的Git服務共享非常簡單, 在許多情況下值得去創(chuàng)建這樣一個Git服務。它不僅保證你隨時可以訪問你的代碼,它的無限制數據存儲、持續(xù)集成跟部署同時為個人Git管理打開了一道Git延伸與拓展的大門。
假如你知道如何使用Git和SSH,那么你已經知道如何創(chuàng)建一個Git服務器了。設計Git的方式,你創(chuàng)建或者克隆一個倉庫時,你已經創(chuàng)建了一半服務器。使能SSH訪問倉庫,并且任何訪問你倉庫的人都可以使用你的回購協(xié)議作為一個新克隆的基礎。
但是,會有一個小特設。有些計劃你可以構建關于同樣數量的精心設計的Git服務器,但是可以具有更好擴展性。
首先是:識別你的用戶,包括閑雜與未來的。假如你是唯一用戶,那么無需任何改變,但是如果你邀請國外的貢獻者了,那么你應該為開發(fā)者搭建一個貢獻共享系統(tǒng)平臺。
假定你有一個可用的服務器(如果不是,Git無法解決這個問題,但是運行在Raspberry Pi 3 的CentOS將會是一個良好開端),第一步是采用SSH鍵值授權登錄,它比密碼登錄更加強大,因為它能免疫于蠻力攻擊,并且可以避免用戶盡可能簡單地刪除它們的鍵值。
在你啟用了SSH密鑰認證之后,就創(chuàng)建一個 gituser用戶。這是一個提供給所有通過了認證的用戶的共享用戶賬號:
1$ su -c 'adduser gituser'
然后切換到這個用戶,并使用合適的權限創(chuàng)建一個 ~/.ssh 框架。這非常重要,因為如果權限設置太過于隨意,你自己針對SSH的防護默認就會失效。
1$ su - gituser
2$ mkdir .ssh && chmod 700 .ssh
3$ touch .ssh/authorized_keys
4$ chmod 600 .ssh/authorized_keys
authorized_keys 文件里面有所有你賦予其權限操作你的Git工程的開發(fā)者的SSH公共密鑰。你的開發(fā)者必須創(chuàng)建屬于他們自己的SSH密鑰并將其中的公共密鑰發(fā)送給你。要把這些公共密鑰復制到gituser的 authorized_keys 文件中去。例如,對于一個叫做Bob的開發(fā)者,可以運行這些命令:
1$ cat ~/path/to/id_rsa.bob.pub >> \
2/home/gituser/.ssh/authorized_keys
當開發(fā)者Bob持有能匹配他發(fā)送給你的公共密鑰的私有密鑰時,他就能以gituser訪問服務器。
不過,你并不會真的想讓你的開發(fā)者訪問到服務器,即使只是以gituser用戶來進行訪問。你想要的是讓他們只能訪問到Git資源庫。因為這個原因,Git提供了一個受限的shell,恰如其分的將其稱為 git-shell、以root用戶運行下面的這些命令可以將git-shell添加到你的系統(tǒng)中,并使其成為gituser用戶的默認shell:
1# grep git-shell /etc/shells || su -c \
2"echo `which git-shell` >> /etc/shells"
3# su -c 'usermod -s git-shell gituser'
現在gituser只能使用SSH來向Git資源庫進行推送和拉取操作,而不能訪問到一個登陸shell。你應該將你自己加入gituser對應的用戶組,在我們的示例服務器中它還是gituser。
例如:
1# usermod -a -G gituser seth
剩下的唯一一個步驟就是創(chuàng)建一個Git資源庫。因為不會有人在服務器上跟它進行直接交互(也就是說你不會通過SSH連上服務器然后直接在資源庫中進行操作), 這使其成為了一個基礎的資源庫。如果你想要把服務器上的資源庫用起來,就要將其從它所在的地方克隆到自己的home目錄中去。
嚴格來說,你并不用使其成為一個基礎資源庫,它還是可以作為一個普通的資源庫來操作的。不過,一個基礎資源庫是沒有*工作樹(working tree)* (也就是說,不會有分支會處在”checkout“狀態(tài))。這很重要,因為遠程用戶不會被允許向一個活動分支進行推送 (你是不會想在一個”dev“分支工作時突然有人將變更推送到你的工作空間的?)。因為基礎資源庫不能有活動分支,那就不會有問題發(fā)生了。
你可以將資源庫放到任何你想要放置的地方, 只要你想賦予權限的用戶和組也能訪問到它就行了。你不會想將目錄存儲到一個用戶的home目錄的,因為這里的權限相當地嚴格, 而是要放在一個通用共享的位置,例如 /opt or /usr/local/share.
以root用戶創(chuàng)建一個基礎資源庫:
1# git init --bare /opt/jupiter.git
2# chown -R gituser:gituser /opt/jupiter.git
3# chmod -R 770 /opt/jupiter.git
現在任何已gituser認證的、或者是位于gituser分組的用戶都可以讀取和寫入jupiter.git資源庫。你可以在自己本機上試試看:
1$ git clone gituser@example.com:/opt/jupiter.git jupiter.clone
2Cloning into 'jupiter.clone'...
3Warning: you appear to have cloned an empty repository.
記住:開發(fā)有必須讓他們的公共SSH密鑰導入gituser用戶的 authorized_keys 文件, 或者是擁有服務器上面的賬戶(就像你一樣), 那樣的話他們就必須是gituser組的成員。
Git鉤子
運行你自己的Git服務器帶來的一個好處是它提供了Git鉤子。Git托管服務有時也提供了一個類似鉤子的接口,但那并不是真正的可以訪問文件系統(tǒng)的Git鉤子。一個Git鉤子是一個腳本,它在Git進程中的某個時刻執(zhí)行。在一個倉庫(repository)接受一個提交(commit)之前,或者收到一個提交之后,或者接收一個推送(push)之前,或者收到一個推送之后等時刻執(zhí)行一個鉤子。
這個系統(tǒng)很簡單:任何可執(zhí)行的腳本都存放在.git/hooks目錄中,使用標準的命名方案,并且在某個指定的時刻執(zhí)行。腳本執(zhí)行的時間由名字來決定;pre-push腳本在推送之前執(zhí)行,post-receive腳本在收到一個提交之后執(zhí)行,諸如此類。它基本上屬于自文檔(self-documenting)。
可以使用任何語言編寫鉤子腳本;如果你能在你的系統(tǒng)上運行某種語言的hello world腳本,那么你就可以使用那門語言來編寫Git鉤子腳本。默認情況下,Git附帶了一些范例,但沒有啟用。
想要運行一個腳本嗎?使用起來很簡單。如果你還沒有Git倉庫的話,首先創(chuàng)建一個。
1$ mkdir jupiter
2$ cd jupiter
3$ git init .
然后編寫一個"hello world" Git鉤子。由于在工作中我為了傳統(tǒng)支持而使用tcsh,所以我堅持使用它作為我的腳本語言,但你可以自由地選用你喜愛的語言(Bash、Python、Ruby、Perl、Rust、Swift、Go):
1$ echo "#\!/bin/tcsh" > .git/hooks/post-commit
2$ echo "echo 'POST-COMMIT SCRIPT TRIGGERED'" > \
3~/jupiter/.git/hooks/post-commit
4$ chmod +x ~/jupiter/.git/hooks/post-commit
現在進行測試:
1$ echo "hello world" > foo.txt
2$ git add foo.txt
3$ git commit -m 'first commit'
4! POST-COMMIT SCRIPT TRIGGERED
5[master (root-commit) c8678e0] first commit
61 file changed, 1 insertion(+)
7create mode 100644 foo.txt
這就是你的第一個可以正常運行的Git鉤子。
著名的推送到web 鉤子
一個流行的Git鉤子用法是自動推送改變部分到工作生產中的web服務器目錄。這是一個偉大構建FTP的方式,保留開發(fā)環(huán)節(jié)的全版本控制,并且整合、自動化發(fā)布內容。
如果正確執(zhí)行,它將會工作運行良好,在某一種程度來說,一直應該做的是考慮如何網絡發(fā)布。它是不錯的。我不知道最初是誰想出這主意的,但是我第一次是從EMacs和來自IBM公司的Git-mentor、Bill Von Hagen那里聽到的。他的文章仍然是對這個過程起決定性作用的介紹:Git 改變分布式Web開發(fā)規(guī)則。
Git變量
每個Git鉤子獲取一組不同的Git動作觸發(fā)它的相關變量。你可能會用到這些變量,也可能用不到。這取決于你所寫的作品。 如果你想要的是一個普通的郵件來通知你,有人推了東西。那么你不需要細節(jié),也不需要腳本,因為你可以套用現有的樣板。如果你想在郵件里瀏覽別人提交的信息和作者,那么對你的腳本要求更高。
Git鉤子并不是用戶直接運行的,所以要理解透如何獲取這些混亂卻重要的信息。事實上,一個Git鉤子腳本與其他任何腳本類似,像BASH、Python、C++或者其他腳本一樣的方式接受來自stdin的參數。不同的是,我們不會提供自己入參,所以使用它時要弄清楚你想要的是什么(參數)。
編寫一個Git鉤子之前,可以進入到你的項目目錄.git/hooks查看Git提供的范例。例如,下面是pre-push.sample文件的注釋部分:
1# $1 -- Name of the remote to which the push is being done
2# $2 -- URL to which the push is being done
3# If pushing without using a named remote those arguments will be equal.
4#
5# Information about commit is supplied as lines
6# to the standard input in this form:
7#
并非所有的范例寫的都那么清晰,文檔對于什么鉤子需要什么變量的說明還有些不足(除非你要閱讀Git的源代碼),不過若有疑問,你可以通過trials of other users進行更多地了解,或者編寫一個簡單的腳本,輸出$1、$2、$3等。
分支檢測范例
我發(fā)現在實際的生產中對鉤子最常見的需求是針對受影響的分支觸發(fā)特定的事件。下面這個例子演示了如何解決這樣的任務。
首先,Git鉤子本身不是版本控制。也就是說,Git不會跟蹤它自己的鉤子,因為Git鉤子是Git的組成部分而不是你的倉庫的一部分。因此,Git鉤子在監(jiān)視提交和推送的同時,可能對你的Git服務器上的遠程倉庫最有意義,而不是作為你的本地倉庫的一部分。
我們來編寫一個基于post-receive運行的鉤子(即,收到一個提交之后)。第一步是識別分支名字:
1#!/bin/tcsh
2foreach arg ( $< )
3set argv = ( $arg )
4set refname = $1
5end
for循環(huán)讀第一個參數($1),然后再次循環(huán)讀入第二個參數值($2),接著用第三個參數($3)再次循環(huán)。在Bash中有更好的方式:使用read命令,將這些值放入一個數組。但是,這里使用的是tcsh,并且變量順序是預先定義好的,這樣做要安全些。
當有即將提交的refname時,我們可以使用Git來獲取可讀性的分支名:
1set branch = `git rev-parse --symbolic --abbrev-ref $refname`
2echo $branch #DEBUG
這時我們可以將分支名與基于動作名的關鍵字進行比較:
01if ( "$branch" == "master" ) then
02echo "Branch detected: master"
03git \
04--work-tree=/path/to/where/you/want/to/copy/stuff/to \
05checkout -f $branch || echo "master fail"
06else if ( "$branch" == "dev" ) then
07echo "Branch detected: dev"
08Git \
09--work-tree=/path/to/where/you/want/to/copy/stuff/to \
10checkout -f $branch || echo "dev fail"
11else
12echo "Your push was successful."
13echo "Private branch detected. No action triggered."
14endif
授予腳本執(zhí)行權限:
1$ chmod +x ~/jupiter/.git/hooks/post-receive
當用戶提交代碼到主服務器上的分支時,這些代碼會被復制到生產環(huán)境的目錄中,當代碼提交到開發(fā)環(huán)境上的分支時,這些代碼會被復制到其它地方,而提交到其它任何分支上時不會觸發(fā)復制的操作。
檢測某人是否正在嘗試將代碼提交到本不應該提交的分支上,或解析提交準許日志,等等的這些操作都像預提交腳本一樣簡單。
Git的鉤子(Hooks)能夠處理復雜的事情,同時它通過利用Git工作的抽象層讓人費解,但它是一個強大的系統(tǒng),允許你設計所有Git基礎設施中的動作。如果你只是想要熟悉這個過程,那你可以簡單研究一下,如果你是一個嚴格的Git用戶或是全職的Git管理員,那你得要深研了!
在接下來的也就是此系列最后一篇文章,我們將學習怎么通過Git來管理非文本的大文件,如音頻文件、圖像文件。
看了“liunx ssh命令詳解”還想看:
4.Linux命令SSH在本地執(zhí)行遠程機器上的命令
-- URL to which the push is being done3# If pushing without using a named remote those arguments will be equal.
4#
5# Information about commit is supplied as lines
6# to the standard input in this form:
7#
并非所有的范例寫的都那么清晰,文檔對于什么鉤子需要什么變量的說明還有些不足(除非你要閱讀Git的源代碼),不過若有疑問,你可以通過trials of other users進行更多地了解,或者編寫一個簡單的腳本,輸出 class="main">
liunx ssh命令詳解
liunx ssh命令詳解
目前為止,用戶對Git的焦點主要在Git的使用上。這篇文章中,我將論述如何管理Git以及自定Git架構的設計。你可能會覺得這聽起來像“先進的Git技術”或者“如果你是學霸讀這篇文章”的委婉說法,但是事實上理解Git如何工作不需要任何的高深知識或者專業(yè)培訓,在一些情況下只需要了解一點Linux。分享Git服務
創(chuàng)建自己的Git服務共享非常簡單, 在許多情況下值得去創(chuàng)建這樣一個Git服務。它不僅保證你隨時可以訪問你的代碼,它的無限制數據存儲、持續(xù)集成跟部署同時為個人Git管理打開了一道Git延伸與拓展的大門。
假如你知道如何使用Git和SSH,那么你已經知道如何創(chuàng)建一個Git服務器了。設計Git的方式,你創(chuàng)建或者克隆一個倉庫時,你已經創(chuàng)建了一半服務器。使能SSH訪問倉庫,并且任何訪問你倉庫的人都可以使用你的回購協(xié)議作為一個新克隆的基礎。
但是,會有一個小特設。有些計劃你可以構建關于同樣數量的精心設計的Git服務器,但是可以具有更好擴展性。
首先是:識別你的用戶,包括閑雜與未來的。假如你是唯一用戶,那么無需任何改變,但是如果你邀請國外的貢獻者了,那么你應該為開發(fā)者搭建一個貢獻共享系統(tǒng)平臺。
假定你有一個可用的服務器(如果不是,Git無法解決這個問題,但是運行在Raspberry Pi 3 的CentOS將會是一個良好開端),第一步是采用SSH鍵值授權登錄,它比密碼登錄更加強大,因為它能免疫于蠻力攻擊,并且可以避免用戶盡可能簡單地刪除它們的鍵值。
在你啟用了SSH密鑰認證之后,就創(chuàng)建一個 gituser用戶。這是一個提供給所有通過了認證的用戶的共享用戶賬號:
1$ su -c 'adduser gituser'
然后切換到這個用戶,并使用合適的權限創(chuàng)建一個 ~/.ssh 框架。這非常重要,因為如果權限設置太過于隨意,你自己針對SSH的防護默認就會失效。
1$ su - gituser
2$ mkdir .ssh && chmod 700 .ssh
3$ touch .ssh/authorized_keys
4$ chmod 600 .ssh/authorized_keys
authorized_keys 文件里面有所有你賦予其權限操作你的Git工程的開發(fā)者的SSH公共密鑰。你的開發(fā)者必須創(chuàng)建屬于他們自己的SSH密鑰并將其中的公共密鑰發(fā)送給你。要把這些公共密鑰復制到gituser的 authorized_keys 文件中去。例如,對于一個叫做Bob的開發(fā)者,可以運行這些命令:
1$ cat ~/path/to/id_rsa.bob.pub >> \
2/home/gituser/.ssh/authorized_keys
當開發(fā)者Bob持有能匹配他發(fā)送給你的公共密鑰的私有密鑰時,他就能以gituser訪問服務器。
不過,你并不會真的想讓你的開發(fā)者訪問到服務器,即使只是以gituser用戶來進行訪問。你想要的是讓他們只能訪問到Git資源庫。因為這個原因,Git提供了一個受限的shell,恰如其分的將其稱為 git-shell、以root用戶運行下面的這些命令可以將git-shell添加到你的系統(tǒng)中,并使其成為gituser用戶的默認shell:
1# grep git-shell /etc/shells || su -c \
2"echo `which git-shell` >> /etc/shells"
3# su -c 'usermod -s git-shell gituser'
現在gituser只能使用SSH來向Git資源庫進行推送和拉取操作,而不能訪問到一個登陸shell。你應該將你自己加入gituser對應的用戶組,在我們的示例服務器中它還是gituser。
例如:
1# usermod -a -G gituser seth
剩下的唯一一個步驟就是創(chuàng)建一個Git資源庫。因為不會有人在服務器上跟它進行直接交互(也就是說你不會通過SSH連上服務器然后直接在資源庫中進行操作), 這使其成為了一個基礎的資源庫。如果你想要把服務器上的資源庫用起來,就要將其從它所在的地方克隆到自己的home目錄中去。
嚴格來說,你并不用使其成為一個基礎資源庫,它還是可以作為一個普通的資源庫來操作的。不過,一個基礎資源庫是沒有*工作樹(working tree)* (也就是說,不會有分支會處在”checkout“狀態(tài))。這很重要,因為遠程用戶不會被允許向一個活動分支進行推送 (你是不會想在一個”dev“分支工作時突然有人將變更推送到你的工作空間的?)。因為基礎資源庫不能有活動分支,那就不會有問題發(fā)生了。
你可以將資源庫放到任何你想要放置的地方, 只要你想賦予權限的用戶和組也能訪問到它就行了。你不會想將目錄存儲到一個用戶的home目錄的,因為這里的權限相當地嚴格, 而是要放在一個通用共享的位置,例如 /opt or /usr/local/share.
以root用戶創(chuàng)建一個基礎資源庫:
1# git init --bare /opt/jupiter.git
2# chown -R gituser:gituser /opt/jupiter.git
3# chmod -R 770 /opt/jupiter.git
現在任何已gituser認證的、或者是位于gituser分組的用戶都可以讀取和寫入jupiter.git資源庫。你可以在自己本機上試試看:
1$ git clone gituser@example.com:/opt/jupiter.git jupiter.clone
2Cloning into 'jupiter.clone'...
3Warning: you appear to have cloned an empty repository.
記?。洪_發(fā)有必須讓他們的公共SSH密鑰導入gituser用戶的 authorized_keys 文件, 或者是擁有服務器上面的賬戶(就像你一樣), 那樣的話他們就必須是gituser組的成員。
Git鉤子
運行你自己的Git服務器帶來的一個好處是它提供了Git鉤子。Git托管服務有時也提供了一個類似鉤子的接口,但那并不是真正的可以訪問文件系統(tǒng)的Git鉤子。一個Git鉤子是一個腳本,它在Git進程中的某個時刻執(zhí)行。在一個倉庫(repository)接受一個提交(commit)之前,或者收到一個提交之后,或者接收一個推送(push)之前,或者收到一個推送之后等時刻執(zhí)行一個鉤子。
這個系統(tǒng)很簡單:任何可執(zhí)行的腳本都存放在.git/hooks目錄中,使用標準的命名方案,并且在某個指定的時刻執(zhí)行。腳本執(zhí)行的時間由名字來決定;pre-push腳本在推送之前執(zhí)行,post-receive腳本在收到一個提交之后執(zhí)行,諸如此類。它基本上屬于自文檔(self-documenting)。
可以使用任何語言編寫鉤子腳本;如果你能在你的系統(tǒng)上運行某種語言的hello world腳本,那么你就可以使用那門語言來編寫Git鉤子腳本。默認情況下,Git附帶了一些范例,但沒有啟用。
想要運行一個腳本嗎?使用起來很簡單。如果你還沒有Git倉庫的話,首先創(chuàng)建一個。
1$ mkdir jupiter
2$ cd jupiter
3$ git init .
然后編寫一個"hello world" Git鉤子。由于在工作中我為了傳統(tǒng)支持而使用tcsh,所以我堅持使用它作為我的腳本語言,但你可以自由地選用你喜愛的語言(Bash、Python、Ruby、Perl、Rust、Swift、Go):
1$ echo "#\!/bin/tcsh" > .git/hooks/post-commit
2$ echo "echo 'POST-COMMIT SCRIPT TRIGGERED'" > \
3~/jupiter/.git/hooks/post-commit
4$ chmod +x ~/jupiter/.git/hooks/post-commit
現在進行測試:
1$ echo "hello world" > foo.txt
2$ git add foo.txt
3$ git commit -m 'first commit'
4! POST-COMMIT SCRIPT TRIGGERED
5[master (root-commit) c8678e0] first commit
61 file changed, 1 insertion(+)
7create mode 100644 foo.txt
這就是你的第一個可以正常運行的Git鉤子。
著名的推送到web 鉤子
一個流行的Git鉤子用法是自動推送改變部分到工作生產中的web服務器目錄。這是一個偉大構建FTP的方式,保留開發(fā)環(huán)節(jié)的全版本控制,并且整合、自動化發(fā)布內容。
如果正確執(zhí)行,它將會工作運行良好,在某一種程度來說,一直應該做的是考慮如何網絡發(fā)布。它是不錯的。我不知道最初是誰想出這主意的,但是我第一次是從EMacs和來自IBM公司的Git-mentor、Bill Von Hagen那里聽到的。他的文章仍然是對這個過程起決定性作用的介紹:Git 改變分布式Web開發(fā)規(guī)則。
Git變量
每個Git鉤子獲取一組不同的Git動作觸發(fā)它的相關變量。你可能會用到這些變量,也可能用不到。這取決于你所寫的作品。 如果你想要的是一個普通的郵件來通知你,有人推了東西。那么你不需要細節(jié),也不需要腳本,因為你可以套用現有的樣板。如果你想在郵件里瀏覽別人提交的信息和作者,那么對你的腳本要求更高。
Git鉤子并不是用戶直接運行的,所以要理解透如何獲取這些混亂卻重要的信息。事實上,一個Git鉤子腳本與其他任何腳本類似,像BASH、Python、C++或者其他腳本一樣的方式接受來自stdin的參數。不同的是,我們不會提供自己入參,所以使用它時要弄清楚你想要的是什么(參數)。
編寫一個Git鉤子之前,可以進入到你的項目目錄.git/hooks查看Git提供的范例。例如,下面是pre-push.sample文件的注釋部分:
1# $1 -- Name of the remote to which the push is being done
2# $2 -- URL to which the push is being done
3# If pushing without using a named remote those arguments will be equal.
4#
5# Information about commit is supplied as lines
6# to the standard input in this form:
7#
并非所有的范例寫的都那么清晰,文檔對于什么鉤子需要什么變量的說明還有些不足(除非你要閱讀Git的源代碼),不過若有疑問,你可以通過trials of other users進行更多地了解,或者編寫一個簡單的腳本,輸出$1、$2、$3等。
分支檢測范例
我發(fā)現在實際的生產中對鉤子最常見的需求是針對受影響的分支觸發(fā)特定的事件。下面這個例子演示了如何解決這樣的任務。
首先,Git鉤子本身不是版本控制。也就是說,Git不會跟蹤它自己的鉤子,因為Git鉤子是Git的組成部分而不是你的倉庫的一部分。因此,Git鉤子在監(jiān)視提交和推送的同時,可能對你的Git服務器上的遠程倉庫最有意義,而不是作為你的本地倉庫的一部分。
我們來編寫一個基于post-receive運行的鉤子(即,收到一個提交之后)。第一步是識別分支名字:
1#!/bin/tcsh
2foreach arg ( $< )
3set argv = ( $arg )
4set refname = $1
5end
for循環(huán)讀第一個參數($1),然后再次循環(huán)讀入第二個參數值($2),接著用第三個參數($3)再次循環(huán)。在Bash中有更好的方式:使用read命令,將這些值放入一個數組。但是,這里使用的是tcsh,并且變量順序是預先定義好的,這樣做要安全些。
當有即將提交的refname時,我們可以使用Git來獲取可讀性的分支名:
1set branch = `git rev-parse --symbolic --abbrev-ref $refname`
2echo $branch #DEBUG
這時我們可以將分支名與基于動作名的關鍵字進行比較:
01if ( "$branch" == "master" ) then
02echo "Branch detected: master"
03git \
04--work-tree=/path/to/where/you/want/to/copy/stuff/to \
05checkout -f $branch || echo "master fail"
06else if ( "$branch" == "dev" ) then
07echo "Branch detected: dev"
08Git \
09--work-tree=/path/to/where/you/want/to/copy/stuff/to \
10checkout -f $branch || echo "dev fail"
11else
12echo "Your push was successful."
13echo "Private branch detected. No action triggered."
14endif
授予腳本執(zhí)行權限:
1$ chmod +x ~/jupiter/.git/hooks/post-receive
當用戶提交代碼到主服務器上的分支時,這些代碼會被復制到生產環(huán)境的目錄中,當代碼提交到開發(fā)環(huán)境上的分支時,這些代碼會被復制到其它地方,而提交到其它任何分支上時不會觸發(fā)復制的操作。
檢測某人是否正在嘗試將代碼提交到本不應該提交的分支上,或解析提交準許日志,等等的這些操作都像預提交腳本一樣簡單。
Git的鉤子(Hooks)能夠處理復雜的事情,同時它通過利用Git工作的抽象層讓人費解,但它是一個強大的系統(tǒng),允許你設計所有Git基礎設施中的動作。如果你只是想要熟悉這個過程,那你可以簡單研究一下,如果你是一個嚴格的Git用戶或是全職的Git管理員,那你得要深研了!
在接下來的也就是此系列最后一篇文章,我們將學習怎么通過Git來管理非文本的大文件,如音頻文件、圖像文件。
看了“liunx ssh命令詳解”還想看:
4.Linux命令SSH在本地執(zhí)行遠程機器上的命令
、等。分支檢測范例
我發(fā)現在實際的生產中對鉤子最常見的需求是針對受影響的分支觸發(fā)特定的事件。下面這個例子演示了如何解決這樣的任務。
首先,Git鉤子本身不是版本控制。也就是說,Git不會跟蹤它自己的鉤子,因為Git鉤子是Git的組成部分而不是你的倉庫的一部分。因此,Git鉤子在監(jiān)視提交和推送的同時,可能對你的Git服務器上的遠程倉庫最有意義,而不是作為你的本地倉庫的一部分。
我們來編寫一個基于post-receive運行的鉤子(即,收到一個提交之后)。第一步是識別分支名字:
1#!/bin/tcsh
2foreach arg ( $< )
3set argv = ( $arg )
4set refname = class="main">
liunx ssh命令詳解
liunx ssh命令詳解
liunx ssh命令詳解
目前為止,用戶對Git的焦點主要在Git的使用上。這篇文章中,我將論述如何管理Git以及自定Git架構的設計。你可能會覺得這聽起來像“先進的Git技術”或者“如果你是學霸讀這篇文章”的委婉說法,但是事實上理解Git如何工作不需要任何的高深知識或者專業(yè)培訓,在一些情況下只需要了解一點Linux。分享Git服務
創(chuàng)建自己的Git服務共享非常簡單, 在許多情況下值得去創(chuàng)建這樣一個Git服務。它不僅保證你隨時可以訪問你的代碼,它的無限制數據存儲、持續(xù)集成跟部署同時為個人Git管理打開了一道Git延伸與拓展的大門。
假如你知道如何使用Git和SSH,那么你已經知道如何創(chuàng)建一個Git服務器了。設計Git的方式,你創(chuàng)建或者克隆一個倉庫時,你已經創(chuàng)建了一半服務器。使能SSH訪問倉庫,并且任何訪問你倉庫的人都可以使用你的回購協(xié)議作為一個新克隆的基礎。
但是,會有一個小特設。有些計劃你可以構建關于同樣數量的精心設計的Git服務器,但是可以具有更好擴展性。
首先是:識別你的用戶,包括閑雜與未來的。假如你是唯一用戶,那么無需任何改變,但是如果你邀請國外的貢獻者了,那么你應該為開發(fā)者搭建一個貢獻共享系統(tǒng)平臺。
假定你有一個可用的服務器(如果不是,Git無法解決這個問題,但是運行在Raspberry Pi 3 的CentOS將會是一個良好開端),第一步是采用SSH鍵值授權登錄,它比密碼登錄更加強大,因為它能免疫于蠻力攻擊,并且可以避免用戶盡可能簡單地刪除它們的鍵值。
在你啟用了SSH密鑰認證之后,就創(chuàng)建一個 gituser用戶。這是一個提供給所有通過了認證的用戶的共享用戶賬號:
1$ su -c 'adduser gituser'
然后切換到這個用戶,并使用合適的權限創(chuàng)建一個 ~/.ssh 框架。這非常重要,因為如果權限設置太過于隨意,你自己針對SSH的防護默認就會失效。
1$ su - gituser
2$ mkdir .ssh && chmod 700 .ssh
3$ touch .ssh/authorized_keys
4$ chmod 600 .ssh/authorized_keys
authorized_keys 文件里面有所有你賦予其權限操作你的Git工程的開發(fā)者的SSH公共密鑰。你的開發(fā)者必須創(chuàng)建屬于他們自己的SSH密鑰并將其中的公共密鑰發(fā)送給你。要把這些公共密鑰復制到gituser的 authorized_keys 文件中去。例如,對于一個叫做Bob的開發(fā)者,可以運行這些命令:
1$ cat ~/path/to/id_rsa.bob.pub >> \
2/home/gituser/.ssh/authorized_keys
當開發(fā)者Bob持有能匹配他發(fā)送給你的公共密鑰的私有密鑰時,他就能以gituser訪問服務器。
不過,你并不會真的想讓你的開發(fā)者訪問到服務器,即使只是以gituser用戶來進行訪問。你想要的是讓他們只能訪問到Git資源庫。因為這個原因,Git提供了一個受限的shell,恰如其分的將其稱為 git-shell、以root用戶運行下面的這些命令可以將git-shell添加到你的系統(tǒng)中,并使其成為gituser用戶的默認shell:
1# grep git-shell /etc/shells || su -c \
2"echo `which git-shell` >> /etc/shells"
3# su -c 'usermod -s git-shell gituser'
現在gituser只能使用SSH來向Git資源庫進行推送和拉取操作,而不能訪問到一個登陸shell。你應該將你自己加入gituser對應的用戶組,在我們的示例服務器中它還是gituser。
例如:
1# usermod -a -G gituser seth
剩下的唯一一個步驟就是創(chuàng)建一個Git資源庫。因為不會有人在服務器上跟它進行直接交互(也就是說你不會通過SSH連上服務器然后直接在資源庫中進行操作), 這使其成為了一個基礎的資源庫。如果你想要把服務器上的資源庫用起來,就要將其從它所在的地方克隆到自己的home目錄中去。
嚴格來說,你并不用使其成為一個基礎資源庫,它還是可以作為一個普通的資源庫來操作的。不過,一個基礎資源庫是沒有*工作樹(working tree)* (也就是說,不會有分支會處在”checkout“狀態(tài))。這很重要,因為遠程用戶不會被允許向一個活動分支進行推送 (你是不會想在一個”dev“分支工作時突然有人將變更推送到你的工作空間的?)。因為基礎資源庫不能有活動分支,那就不會有問題發(fā)生了。
你可以將資源庫放到任何你想要放置的地方, 只要你想賦予權限的用戶和組也能訪問到它就行了。你不會想將目錄存儲到一個用戶的home目錄的,因為這里的權限相當地嚴格, 而是要放在一個通用共享的位置,例如 /opt or /usr/local/share.
以root用戶創(chuàng)建一個基礎資源庫:
1# git init --bare /opt/jupiter.git
2# chown -R gituser:gituser /opt/jupiter.git
3# chmod -R 770 /opt/jupiter.git
現在任何已gituser認證的、或者是位于gituser分組的用戶都可以讀取和寫入jupiter.git資源庫。你可以在自己本機上試試看:
1$ git clone gituser@example.com:/opt/jupiter.git jupiter.clone
2Cloning into 'jupiter.clone'...
3Warning: you appear to have cloned an empty repository.
記?。洪_發(fā)有必須讓他們的公共SSH密鑰導入gituser用戶的 authorized_keys 文件, 或者是擁有服務器上面的賬戶(就像你一樣), 那樣的話他們就必須是gituser組的成員。
Git鉤子
運行你自己的Git服務器帶來的一個好處是它提供了Git鉤子。Git托管服務有時也提供了一個類似鉤子的接口,但那并不是真正的可以訪問文件系統(tǒng)的Git鉤子。一個Git鉤子是一個腳本,它在Git進程中的某個時刻執(zhí)行。在一個倉庫(repository)接受一個提交(commit)之前,或者收到一個提交之后,或者接收一個推送(push)之前,或者收到一個推送之后等時刻執(zhí)行一個鉤子。
這個系統(tǒng)很簡單:任何可執(zhí)行的腳本都存放在.git/hooks目錄中,使用標準的命名方案,并且在某個指定的時刻執(zhí)行。腳本執(zhí)行的時間由名字來決定;pre-push腳本在推送之前執(zhí)行,post-receive腳本在收到一個提交之后執(zhí)行,諸如此類。它基本上屬于自文檔(self-documenting)。
可以使用任何語言編寫鉤子腳本;如果你能在你的系統(tǒng)上運行某種語言的hello world腳本,那么你就可以使用那門語言來編寫Git鉤子腳本。默認情況下,Git附帶了一些范例,但沒有啟用。
想要運行一個腳本嗎?使用起來很簡單。如果你還沒有Git倉庫的話,首先創(chuàng)建一個。
1$ mkdir jupiter
2$ cd jupiter
3$ git init .
然后編寫一個"hello world" Git鉤子。由于在工作中我為了傳統(tǒng)支持而使用tcsh,所以我堅持使用它作為我的腳本語言,但你可以自由地選用你喜愛的語言(Bash、Python、Ruby、Perl、Rust、Swift、Go):
1$ echo "#\!/bin/tcsh" > .git/hooks/post-commit
2$ echo "echo 'POST-COMMIT SCRIPT TRIGGERED'" > \
3~/jupiter/.git/hooks/post-commit
4$ chmod +x ~/jupiter/.git/hooks/post-commit
現在進行測試:
1$ echo "hello world" > foo.txt
2$ git add foo.txt
3$ git commit -m 'first commit'
4! POST-COMMIT SCRIPT TRIGGERED
5[master (root-commit) c8678e0] first commit
61 file changed, 1 insertion(+)
7create mode 100644 foo.txt
這就是你的第一個可以正常運行的Git鉤子。
著名的推送到web 鉤子
一個流行的Git鉤子用法是自動推送改變部分到工作生產中的web服務器目錄。這是一個偉大構建FTP的方式,保留開發(fā)環(huán)節(jié)的全版本控制,并且整合、自動化發(fā)布內容。
如果正確執(zhí)行,它將會工作運行良好,在某一種程度來說,一直應該做的是考慮如何網絡發(fā)布。它是不錯的。我不知道最初是誰想出這主意的,但是我第一次是從EMacs和來自IBM公司的Git-mentor、Bill Von Hagen那里聽到的。他的文章仍然是對這個過程起決定性作用的介紹:Git 改變分布式Web開發(fā)規(guī)則。
Git變量
每個Git鉤子獲取一組不同的Git動作觸發(fā)它的相關變量。你可能會用到這些變量,也可能用不到。這取決于你所寫的作品。 如果你想要的是一個普通的郵件來通知你,有人推了東西。那么你不需要細節(jié),也不需要腳本,因為你可以套用現有的樣板。如果你想在郵件里瀏覽別人提交的信息和作者,那么對你的腳本要求更高。
Git鉤子并不是用戶直接運行的,所以要理解透如何獲取這些混亂卻重要的信息。事實上,一個Git鉤子腳本與其他任何腳本類似,像BASH、Python、C++或者其他腳本一樣的方式接受來自stdin的參數。不同的是,我們不會提供自己入參,所以使用它時要弄清楚你想要的是什么(參數)。
編寫一個Git鉤子之前,可以進入到你的項目目錄.git/hooks查看Git提供的范例。例如,下面是pre-push.sample文件的注釋部分:
1# $1 -- Name of the remote to which the push is being done
2# $2 -- URL to which the push is being done
3# If pushing without using a named remote those arguments will be equal.
4#
5# Information about commit is supplied as lines
6# to the standard input in this form:
7#
并非所有的范例寫的都那么清晰,文檔對于什么鉤子需要什么變量的說明還有些不足(除非你要閱讀Git的源代碼),不過若有疑問,你可以通過trials of other users進行更多地了解,或者編寫一個簡單的腳本,輸出$1、$2、$3等。
分支檢測范例
我發(fā)現在實際的生產中對鉤子最常見的需求是針對受影響的分支觸發(fā)特定的事件。下面這個例子演示了如何解決這樣的任務。
首先,Git鉤子本身不是版本控制。也就是說,Git不會跟蹤它自己的鉤子,因為Git鉤子是Git的組成部分而不是你的倉庫的一部分。因此,Git鉤子在監(jiān)視提交和推送的同時,可能對你的Git服務器上的遠程倉庫最有意義,而不是作為你的本地倉庫的一部分。
我們來編寫一個基于post-receive運行的鉤子(即,收到一個提交之后)。第一步是識別分支名字:
1#!/bin/tcsh
2foreach arg ( $< )
3set argv = ( $arg )
4set refname = $1
5end
for循環(huán)讀第一個參數($1),然后再次循環(huán)讀入第二個參數值($2),接著用第三個參數($3)再次循環(huán)。在Bash中有更好的方式:使用read命令,將這些值放入一個數組。但是,這里使用的是tcsh,并且變量順序是預先定義好的,這樣做要安全些。
當有即將提交的refname時,我們可以使用Git來獲取可讀性的分支名:
1set branch = `git rev-parse --symbolic --abbrev-ref $refname`
2echo $branch #DEBUG
這時我們可以將分支名與基于動作名的關鍵字進行比較:
01if ( "$branch" == "master" ) then
02echo "Branch detected: master"
03git \
04--work-tree=/path/to/where/you/want/to/copy/stuff/to \
05checkout -f $branch || echo "master fail"
06else if ( "$branch" == "dev" ) then
07echo "Branch detected: dev"
08Git \
09--work-tree=/path/to/where/you/want/to/copy/stuff/to \
10checkout -f $branch || echo "dev fail"
11else
12echo "Your push was successful."
13echo "Private branch detected. No action triggered."
14endif
授予腳本執(zhí)行權限:
1$ chmod +x ~/jupiter/.git/hooks/post-receive
當用戶提交代碼到主服務器上的分支時,這些代碼會被復制到生產環(huán)境的目錄中,當代碼提交到開發(fā)環(huán)境上的分支時,這些代碼會被復制到其它地方,而提交到其它任何分支上時不會觸發(fā)復制的操作。
檢測某人是否正在嘗試將代碼提交到本不應該提交的分支上,或解析提交準許日志,等等的這些操作都像預提交腳本一樣簡單。
Git的鉤子(Hooks)能夠處理復雜的事情,同時它通過利用Git工作的抽象層讓人費解,但它是一個強大的系統(tǒng),允許你設計所有Git基礎設施中的動作。如果你只是想要熟悉這個過程,那你可以簡單研究一下,如果你是一個嚴格的Git用戶或是全職的Git管理員,那你得要深研了!
在接下來的也就是此系列最后一篇文章,我們將學習怎么通過Git來管理非文本的大文件,如音頻文件、圖像文件。
看了“liunx ssh命令詳解”還想看:
4.Linux命令SSH在本地執(zhí)行遠程機器上的命令
),接著用第三個參數()再次循環(huán)。在Bash中有更好的方式:使用read命令,將這些值放入一個數組。但是,這里使用的是tcsh,并且變量順序是預先定義好的,這樣做要安全些。當有即將提交的refname時,我們可以使用Git來獲取可讀性的分支名:
1set branch = `git rev-parse --symbolic --abbrev-ref $refname`
2echo $branch #DEBUG
這時我們可以將分支名與基于動作名的關鍵字進行比較:
01if ( "$branch" == "master" ) then
02echo "Branch detected: master"
03git \
04--work-tree=/path/to/where/you/want/to/copy/stuff/to \
05checkout -f $branch || echo "master fail"
06else if ( "$branch" == "dev" ) then
07echo "Branch detected: dev"
08Git \
09--work-tree=/path/to/where/you/want/to/copy/stuff/to \
10checkout -f $branch || echo "dev fail"
11else
12echo "Your push was successful."
13echo "Private branch detected. No action triggered."
14endif
授予腳本執(zhí)行權限:
1$ chmod +x ~/jupiter/.git/hooks/post-receive
當用戶提交代碼到主服務器上的分支時,這些代碼會被復制到生產環(huán)境的目錄中,當代碼提交到開發(fā)環(huán)境上的分支時,這些代碼會被復制到其它地方,而提交到其它任何分支上時不會觸發(fā)復制的操作。
檢測某人是否正在嘗試將代碼提交到本不應該提交的分支上,或解析提交準許日志,等等的這些操作都像預提交腳本一樣簡單。
Git的鉤子(Hooks)能夠處理復雜的事情,同時它通過利用Git工作的抽象層讓人費解,但它是一個強大的系統(tǒng),允許你設計所有Git基礎設施中的動作。如果你只是想要熟悉這個過程,那你可以簡單研究一下,如果你是一個嚴格的Git用戶或是全職的Git管理員,那你得要深研了!
在接下來的也就是此系列最后一篇文章,我們將學習怎么通過Git來管理非文本的大文件,如音頻文件、圖像文件。
看了“liunx ssh命令詳解”還想看: