不卡AV在线|网页在线观看无码高清|亚洲国产亚洲国产|国产伦精品一区二区三区免费视频

學(xué)習(xí)啦>學(xué)習(xí)電腦>操作系統(tǒng)>Linux教程>

liunx ssh命令詳解

時間: 志藝942 分享

  我們將開始學(xué)習(xí)如何構(gòu)建一個Git服務(wù)器,如何在具體的事件中寫一個針對特定的觸發(fā)操作的自定義Git(例如通告),如何發(fā)布你的代碼到一個網(wǎng)站。接下來是小編為大家收集的liunx ssh命令詳解,歡迎大家閱讀:

  liunx ssh命令詳解

  目前為止,用戶對Git的焦點主要在Git的使用上。這篇文章中,我將論述如何管理Git以及自定Git架構(gòu)的設(shè)計。你可能會覺得這聽起來像“先進(jìn)的Git技術(shù)”或者“如果你是學(xué)霸讀這篇文章”的委婉說法,但是事實上理解Git如何工作不需要任何的高深知識或者專業(yè)培訓(xùn),在一些情況下只需要了解一點Linux。分享Git服務(wù)

  創(chuàng)建自己的Git服務(wù)共享非常簡單, 在許多情況下值得去創(chuàng)建這樣一個Git服務(wù)。它不僅保證你隨時可以訪問你的代碼,它的無限制數(shù)據(jù)存儲、持續(xù)集成跟部署同時為個人Git管理打開了一道Git延伸與拓展的大門。

  假如你知道如何使用Git和SSH,那么你已經(jīng)知道如何創(chuàng)建一個Git服務(wù)器了。設(shè)計Git的方式,你創(chuàng)建或者克隆一個倉庫時,你已經(jīng)創(chuàng)建了一半服務(wù)器。使能SSH訪問倉庫,并且任何訪問你倉庫的人都可以使用你的回購協(xié)議作為一個新克隆的基礎(chǔ)。

  但是,會有一個小特設(shè)。有些計劃你可以構(gòu)建關(guān)于同樣數(shù)量的精心設(shè)計的Git服務(wù)器,但是可以具有更好擴(kuò)展性。

  首先是:識別你的用戶,包括閑雜與未來的。假如你是唯一用戶,那么無需任何改變,但是如果你邀請國外的貢獻(xiàn)者了,那么你應(yīng)該為開發(fā)者搭建一個貢獻(xiàn)共享系統(tǒng)平臺。

  假定你有一個可用的服務(wù)器(如果不是,Git無法解決這個問題,但是運行在Raspberry Pi 3 的CentOS將會是一個良好開端),第一步是采用SSH鍵值授權(quán)登錄,它比密碼登錄更加強(qiáng)大,因為它能免疫于蠻力攻擊,并且可以避免用戶盡可能簡單地刪除它們的鍵值。

  在你啟用了SSH密鑰認(rèn)證之后,就創(chuàng)建一個 gituser用戶。這是一個提供給所有通過了認(rèn)證的用戶的共享用戶賬號:

  1$ su -c 'adduser gituser'

  然后切換到這個用戶,并使用合適的權(quán)限創(chuàng)建一個 ~/.ssh 框架。這非常重要,因為如果權(quán)限設(shè)置太過于隨意,你自己針對SSH的防護(hù)默認(rèn)就會失效。

  1$ su - gituser

  2$ mkdir .ssh && chmod 700 .ssh

  3$ touch .ssh/authorized_keys

  4$ chmod 600 .ssh/authorized_keys

  authorized_keys 文件里面有所有你賦予其權(quán)限操作你的Git工程的開發(fā)者的SSH公共密鑰。你的開發(fā)者必須創(chuàng)建屬于他們自己的SSH密鑰并將其中的公共密鑰發(fā)送給你。要把這些公共密鑰復(fù)制到gituser的 authorized_keys 文件中去。例如,對于一個叫做Bob的開發(fā)者,可以運行這些命令:

  1$ cat ~/path/to/id_rsa.bob.pub >> \

  2/home/gituser/.ssh/authorized_keys

  當(dāng)開發(fā)者Bob持有能匹配他發(fā)送給你的公共密鑰的私有密鑰時,他就能以gituser訪問服務(wù)器。

  不過,你并不會真的想讓你的開發(fā)者訪問到服務(wù)器,即使只是以gituser用戶來進(jìn)行訪問。你想要的是讓他們只能訪問到Git資源庫。因為這個原因,Git提供了一個受限的shell,恰如其分的將其稱為 git-shell、以root用戶運行下面的這些命令可以將git-shell添加到你的系統(tǒng)中,并使其成為gituser用戶的默認(rèn)shell:

  1# grep git-shell /etc/shells || su -c \

  2"echo `which git-shell` >> /etc/shells"

  3# su -c 'usermod -s git-shell gituser'

  現(xiàn)在gituser只能使用SSH來向Git資源庫進(jìn)行推送和拉取操作,而不能訪問到一個登陸shell。你應(yīng)該將你自己加入gituser對應(yīng)的用戶組,在我們的示例服務(wù)器中它還是gituser。

  例如:

  1# usermod -a -G gituser seth

  剩下的唯一一個步驟就是創(chuàng)建一個Git資源庫。因為不會有人在服務(wù)器上跟它進(jìn)行直接交互(也就是說你不會通過SSH連上服務(wù)器然后直接在資源庫中進(jìn)行操作), 這使其成為了一個基礎(chǔ)的資源庫。如果你想要把服務(wù)器上的資源庫用起來,就要將其從它所在的地方克隆到自己的home目錄中去。

  嚴(yán)格來說,你并不用使其成為一個基礎(chǔ)資源庫,它還是可以作為一個普通的資源庫來操作的。不過,一個基礎(chǔ)資源庫是沒有*工作樹(working tree)* (也就是說,不會有分支會處在”checkout“狀態(tài))。這很重要,因為遠(yuǎn)程用戶不會被允許向一個活動分支進(jìn)行推送 (你是不會想在一個”dev“分支工作時突然有人將變更推送到你的工作空間的?)。因為基礎(chǔ)資源庫不能有活動分支,那就不會有問題發(fā)生了。

  你可以將資源庫放到任何你想要放置的地方, 只要你想賦予權(quán)限的用戶和組也能訪問到它就行了。你不會想將目錄存儲到一個用戶的home目錄的,因為這里的權(quán)限相當(dāng)?shù)貒?yán)格, 而是要放在一個通用共享的位置,例如 /opt or /usr/local/share.

  以root用戶創(chuàng)建一個基礎(chǔ)資源庫:

  1# git init --bare /opt/jupiter.git

  2# chown -R gituser:gituser /opt/jupiter.git

  3# chmod -R 770 /opt/jupiter.git

  現(xiàn)在任何已gituser認(rèn)證的、或者是位于gituser分組的用戶都可以讀取和寫入jupiter.git資源庫。你可以在自己本機(jī)上試試看:

  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密鑰導(dǎo)入gituser用戶的 authorized_keys 文件, 或者是擁有服務(wù)器上面的賬戶(就像你一樣), 那樣的話他們就必須是gituser組的成員。

  Git鉤子

  運行你自己的Git服務(wù)器帶來的一個好處是它提供了Git鉤子。Git托管服務(wù)有時也提供了一個類似鉤子的接口,但那并不是真正的可以訪問文件系統(tǒng)的Git鉤子。一個Git鉤子是一個腳本,它在Git進(jìn)程中的某個時刻執(zhí)行。在一個倉庫(repository)接受一個提交(commit)之前,或者收到一個提交之后,或者接收一個推送(push)之前,或者收到一個推送之后等時刻執(zhí)行一個鉤子。

  這個系統(tǒng)很簡單:任何可執(zhí)行的腳本都存放在.git/hooks目錄中,使用標(biāo)準(zhǔn)的命名方案,并且在某個指定的時刻執(zhí)行。腳本執(zhí)行的時間由名字來決定;pre-push腳本在推送之前執(zhí)行,post-receive腳本在收到一個提交之后執(zhí)行,諸如此類。它基本上屬于自文檔(self-documenting)。

  可以使用任何語言編寫鉤子腳本;如果你能在你的系統(tǒng)上運行某種語言的hello world腳本,那么你就可以使用那門語言來編寫Git鉤子腳本。默認(rèn)情況下,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

  現(xiàn)在進(jìn)行測試:

  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鉤子用法是自動推送改變部分到工作生產(chǎn)中的web服務(wù)器目錄。這是一個偉大構(gòu)建FTP的方式,保留開發(fā)環(huán)節(jié)的全版本控制,并且整合、自動化發(fā)布內(nèi)容。

  如果正確執(zhí)行,它將會工作運行良好,在某一種程度來說,一直應(yīng)該做的是考慮如何網(wǎng)絡(luò)發(fā)布。它是不錯的。我不知道最初是誰想出這主意的,但是我第一次是從EMacs和來自IBM公司的Git-mentor、Bill Von Hagen那里聽到的。他的文章仍然是對這個過程起決定性作用的介紹:Git 改變分布式Web開發(fā)規(guī)則。

  Git變量

  每個Git鉤子獲取一組不同的Git動作觸發(fā)它的相關(guān)變量。你可能會用到這些變量,也可能用不到。這取決于你所寫的作品。 如果你想要的是一個普通的郵件來通知你,有人推了東西。那么你不需要細(xì)節(jié),也不需要腳本,因為你可以套用現(xiàn)有的樣板。如果你想在郵件里瀏覽別人提交的信息和作者,那么對你的腳本要求更高。

  Git鉤子并不是用戶直接運行的,所以要理解透如何獲取這些混亂卻重要的信息。事實上,一個Git鉤子腳本與其他任何腳本類似,像BASH、Python、C++或者其他腳本一樣的方式接受來自stdin的參數(shù)。不同的是,我們不會提供自己入?yún)?,所以使用它時要弄清楚你想要的是什么(參數(shù))。

  編寫一個Git鉤子之前,可以進(jìn)入到你的項目目錄.git/hooks查看Git提供的范例。例如,下面是pre-push.sample文件的注釋部分:

  1# class="main">

liunx ssh命令詳解

時間: 志藝942 分享

  2#

  我們將開始學(xué)習(xí)如何構(gòu)建一個Git服務(wù)器,如何在具體的事件中寫一個針對特定的觸發(fā)操作的自定義Git(例如通告),如何發(fā)布你的代碼到一個網(wǎng)站。接下來是小編為大家收集的liunx ssh命令詳解,歡迎大家閱讀:

  liunx ssh命令詳解

  目前為止,用戶對Git的焦點主要在Git的使用上。這篇文章中,我將論述如何管理Git以及自定Git架構(gòu)的設(shè)計。你可能會覺得這聽起來像“先進(jìn)的Git技術(shù)”或者“如果你是學(xué)霸讀這篇文章”的委婉說法,但是事實上理解Git如何工作不需要任何的高深知識或者專業(yè)培訓(xùn),在一些情況下只需要了解一點Linux。分享Git服務(wù)

  創(chuàng)建自己的Git服務(wù)共享非常簡單, 在許多情況下值得去創(chuàng)建這樣一個Git服務(wù)。它不僅保證你隨時可以訪問你的代碼,它的無限制數(shù)據(jù)存儲、持續(xù)集成跟部署同時為個人Git管理打開了一道Git延伸與拓展的大門。

  假如你知道如何使用Git和SSH,那么你已經(jīng)知道如何創(chuàng)建一個Git服務(wù)器了。設(shè)計Git的方式,你創(chuàng)建或者克隆一個倉庫時,你已經(jīng)創(chuàng)建了一半服務(wù)器。使能SSH訪問倉庫,并且任何訪問你倉庫的人都可以使用你的回購協(xié)議作為一個新克隆的基礎(chǔ)。

  但是,會有一個小特設(shè)。有些計劃你可以構(gòu)建關(guān)于同樣數(shù)量的精心設(shè)計的Git服務(wù)器,但是可以具有更好擴(kuò)展性。

  首先是:識別你的用戶,包括閑雜與未來的。假如你是唯一用戶,那么無需任何改變,但是如果你邀請國外的貢獻(xiàn)者了,那么你應(yīng)該為開發(fā)者搭建一個貢獻(xiàn)共享系統(tǒng)平臺。

  假定你有一個可用的服務(wù)器(如果不是,Git無法解決這個問題,但是運行在Raspberry Pi 3 的CentOS將會是一個良好開端),第一步是采用SSH鍵值授權(quán)登錄,它比密碼登錄更加強(qiáng)大,因為它能免疫于蠻力攻擊,并且可以避免用戶盡可能簡單地刪除它們的鍵值。

  在你啟用了SSH密鑰認(rèn)證之后,就創(chuàng)建一個 gituser用戶。這是一個提供給所有通過了認(rèn)證的用戶的共享用戶賬號:

  1$ su -c 'adduser gituser'

  然后切換到這個用戶,并使用合適的權(quán)限創(chuàng)建一個 ~/.ssh 框架。這非常重要,因為如果權(quán)限設(shè)置太過于隨意,你自己針對SSH的防護(hù)默認(rèn)就會失效。

  1$ su - gituser

  2$ mkdir .ssh && chmod 700 .ssh

  3$ touch .ssh/authorized_keys

  4$ chmod 600 .ssh/authorized_keys

  authorized_keys 文件里面有所有你賦予其權(quán)限操作你的Git工程的開發(fā)者的SSH公共密鑰。你的開發(fā)者必須創(chuàng)建屬于他們自己的SSH密鑰并將其中的公共密鑰發(fā)送給你。要把這些公共密鑰復(fù)制到gituser的 authorized_keys 文件中去。例如,對于一個叫做Bob的開發(fā)者,可以運行這些命令:

  1$ cat ~/path/to/id_rsa.bob.pub >> \

  2/home/gituser/.ssh/authorized_keys

  當(dāng)開發(fā)者Bob持有能匹配他發(fā)送給你的公共密鑰的私有密鑰時,他就能以gituser訪問服務(wù)器。

  不過,你并不會真的想讓你的開發(fā)者訪問到服務(wù)器,即使只是以gituser用戶來進(jìn)行訪問。你想要的是讓他們只能訪問到Git資源庫。因為這個原因,Git提供了一個受限的shell,恰如其分的將其稱為 git-shell、以root用戶運行下面的這些命令可以將git-shell添加到你的系統(tǒng)中,并使其成為gituser用戶的默認(rèn)shell:

  1# grep git-shell /etc/shells || su -c \

  2"echo `which git-shell` >> /etc/shells"

  3# su -c 'usermod -s git-shell gituser'

  現(xiàn)在gituser只能使用SSH來向Git資源庫進(jìn)行推送和拉取操作,而不能訪問到一個登陸shell。你應(yīng)該將你自己加入gituser對應(yīng)的用戶組,在我們的示例服務(wù)器中它還是gituser。

  例如:

  1# usermod -a -G gituser seth

  剩下的唯一一個步驟就是創(chuàng)建一個Git資源庫。因為不會有人在服務(wù)器上跟它進(jìn)行直接交互(也就是說你不會通過SSH連上服務(wù)器然后直接在資源庫中進(jìn)行操作), 這使其成為了一個基礎(chǔ)的資源庫。如果你想要把服務(wù)器上的資源庫用起來,就要將其從它所在的地方克隆到自己的home目錄中去。

  嚴(yán)格來說,你并不用使其成為一個基礎(chǔ)資源庫,它還是可以作為一個普通的資源庫來操作的。不過,一個基礎(chǔ)資源庫是沒有*工作樹(working tree)* (也就是說,不會有分支會處在”checkout“狀態(tài))。這很重要,因為遠(yuǎn)程用戶不會被允許向一個活動分支進(jìn)行推送 (你是不會想在一個”dev“分支工作時突然有人將變更推送到你的工作空間的?)。因為基礎(chǔ)資源庫不能有活動分支,那就不會有問題發(fā)生了。

  你可以將資源庫放到任何你想要放置的地方, 只要你想賦予權(quán)限的用戶和組也能訪問到它就行了。你不會想將目錄存儲到一個用戶的home目錄的,因為這里的權(quán)限相當(dāng)?shù)貒?yán)格, 而是要放在一個通用共享的位置,例如 /opt or /usr/local/share.

  以root用戶創(chuàng)建一個基礎(chǔ)資源庫:

  1# git init --bare /opt/jupiter.git

  2# chown -R gituser:gituser /opt/jupiter.git

  3# chmod -R 770 /opt/jupiter.git

  現(xiàn)在任何已gituser認(rèn)證的、或者是位于gituser分組的用戶都可以讀取和寫入jupiter.git資源庫。你可以在自己本機(jī)上試試看:

  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密鑰導(dǎo)入gituser用戶的 authorized_keys 文件, 或者是擁有服務(wù)器上面的賬戶(就像你一樣), 那樣的話他們就必須是gituser組的成員。

  Git鉤子

  運行你自己的Git服務(wù)器帶來的一個好處是它提供了Git鉤子。Git托管服務(wù)有時也提供了一個類似鉤子的接口,但那并不是真正的可以訪問文件系統(tǒng)的Git鉤子。一個Git鉤子是一個腳本,它在Git進(jìn)程中的某個時刻執(zhí)行。在一個倉庫(repository)接受一個提交(commit)之前,或者收到一個提交之后,或者接收一個推送(push)之前,或者收到一個推送之后等時刻執(zhí)行一個鉤子。

  這個系統(tǒng)很簡單:任何可執(zhí)行的腳本都存放在.git/hooks目錄中,使用標(biāo)準(zhǔn)的命名方案,并且在某個指定的時刻執(zhí)行。腳本執(zhí)行的時間由名字來決定;pre-push腳本在推送之前執(zhí)行,post-receive腳本在收到一個提交之后執(zhí)行,諸如此類。它基本上屬于自文檔(self-documenting)。

  可以使用任何語言編寫鉤子腳本;如果你能在你的系統(tǒng)上運行某種語言的hello world腳本,那么你就可以使用那門語言來編寫Git鉤子腳本。默認(rèn)情況下,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

  現(xiàn)在進(jìn)行測試:

  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鉤子用法是自動推送改變部分到工作生產(chǎn)中的web服務(wù)器目錄。這是一個偉大構(gòu)建FTP的方式,保留開發(fā)環(huán)節(jié)的全版本控制,并且整合、自動化發(fā)布內(nèi)容。

  如果正確執(zhí)行,它將會工作運行良好,在某一種程度來說,一直應(yīng)該做的是考慮如何網(wǎng)絡(luò)發(fā)布。它是不錯的。我不知道最初是誰想出這主意的,但是我第一次是從EMacs和來自IBM公司的Git-mentor、Bill Von Hagen那里聽到的。他的文章仍然是對這個過程起決定性作用的介紹:Git 改變分布式Web開發(fā)規(guī)則。

  Git變量

  每個Git鉤子獲取一組不同的Git動作觸發(fā)它的相關(guān)變量。你可能會用到這些變量,也可能用不到。這取決于你所寫的作品。 如果你想要的是一個普通的郵件來通知你,有人推了東西。那么你不需要細(xì)節(jié),也不需要腳本,因為你可以套用現(xiàn)有的樣板。如果你想在郵件里瀏覽別人提交的信息和作者,那么對你的腳本要求更高。

  Git鉤子并不是用戶直接運行的,所以要理解透如何獲取這些混亂卻重要的信息。事實上,一個Git鉤子腳本與其他任何腳本類似,像BASH、Python、C++或者其他腳本一樣的方式接受來自stdin的參數(shù)。不同的是,我們不會提供自己入?yún)?,所以使用它時要弄清楚你想要的是什么(參數(shù))。

  編寫一個Git鉤子之前,可以進(jìn)入到你的項目目錄.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進(jìn)行更多地了解,或者編寫一個簡單的腳本,輸出$1、$2、$3等。

  分支檢測范例

  我發(fā)現(xiàn)在實際的生產(chǎn)中對鉤子最常見的需求是針對受影響的分支觸發(fā)特定的事件。下面這個例子演示了如何解決這樣的任務(wù)。

  首先,Git鉤子本身不是版本控制。也就是說,Git不會跟蹤它自己的鉤子,因為Git鉤子是Git的組成部分而不是你的倉庫的一部分。因此,Git鉤子在監(jiān)視提交和推送的同時,可能對你的Git服務(wù)器上的遠(yuǎn)程倉庫最有意義,而不是作為你的本地倉庫的一部分。

  我們來編寫一個基于post-receive運行的鉤子(即,收到一個提交之后)。第一步是識別分支名字:

  1#!/bin/tcsh

  2foreach arg ( $< )

  3set argv = ( $arg )

  4set refname = $1

  5end

  for循環(huán)讀第一個參數(shù)($1),然后再次循環(huán)讀入第二個參數(shù)值($2),接著用第三個參數(shù)($3)再次循環(huán)。在Bash中有更好的方式:使用read命令,將這些值放入一個數(shù)組。但是,這里使用的是tcsh,并且變量順序是預(yù)先定義好的,這樣做要安全些。

  當(dāng)有即將提交的refname時,我們可以使用Git來獲取可讀性的分支名:

  1set branch = `git rev-parse --symbolic --abbrev-ref $refname`

  2echo $branch #DEBUG

  這時我們可以將分支名與基于動作名的關(guān)鍵字進(jìn)行比較:

  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í)行權(quán)限:

  1$ chmod +x ~/jupiter/.git/hooks/post-receive

  當(dāng)用戶提交代碼到主服務(wù)器上的分支時,這些代碼會被復(fù)制到生產(chǎn)環(huán)境的目錄中,當(dāng)代碼提交到開發(fā)環(huán)境上的分支時,這些代碼會被復(fù)制到其它地方,而提交到其它任何分支上時不會觸發(fā)復(fù)制的操作。

  檢測某人是否正在嘗試將代碼提交到本不應(yīng)該提交的分支上,或解析提交準(zhǔn)許日志,等等的這些操作都像預(yù)提交腳本一樣簡單。

  Git的鉤子(Hooks)能夠處理復(fù)雜的事情,同時它通過利用Git工作的抽象層讓人費解,但它是一個強(qiáng)大的系統(tǒng),允許你設(shè)計所有Git基礎(chǔ)設(shè)施中的動作。如果你只是想要熟悉這個過程,那你可以簡單研究一下,如果你是一個嚴(yán)格的Git用戶或是全職的Git管理員,那你得要深研了!

  在接下來的也就是此系列最后一篇文章,我們將學(xué)習(xí)怎么通過Git來管理非文本的大文件,如音頻文件、圖像文件。

  
看了“liunx ssh命令詳解”還想看:

1.Linux系統(tǒng)中SSH命令的使用教程

2.linux命令ssh遠(yuǎn)程登錄命令簡單實例

3.linux命令 ssh使用解析

4.Linux命令SSH在本地執(zhí)行遠(yuǎn)程機(jī)器上的命令

5.ssh遠(yuǎn)程執(zhí)行命令方法和Shell腳本實例

-- 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進(jìn)行更多地了解,或者編寫一個簡單的腳本,輸出 class="main">

liunx ssh命令詳解

時間: 志藝942 分享
  我們將開始學(xué)習(xí)如何構(gòu)建一個Git服務(wù)器,如何在具體的事件中寫一個針對特定的觸發(fā)操作的自定義Git(例如通告),如何發(fā)布你的代碼到一個網(wǎng)站。接下來是小編為大家收集的liunx ssh命令詳解,歡迎大家閱讀:

  liunx ssh命令詳解

  目前為止,用戶對Git的焦點主要在Git的使用上。這篇文章中,我將論述如何管理Git以及自定Git架構(gòu)的設(shè)計。你可能會覺得這聽起來像“先進(jìn)的Git技術(shù)”或者“如果你是學(xué)霸讀這篇文章”的委婉說法,但是事實上理解Git如何工作不需要任何的高深知識或者專業(yè)培訓(xùn),在一些情況下只需要了解一點Linux。分享Git服務(wù)

  創(chuàng)建自己的Git服務(wù)共享非常簡單, 在許多情況下值得去創(chuàng)建這樣一個Git服務(wù)。它不僅保證你隨時可以訪問你的代碼,它的無限制數(shù)據(jù)存儲、持續(xù)集成跟部署同時為個人Git管理打開了一道Git延伸與拓展的大門。

  假如你知道如何使用Git和SSH,那么你已經(jīng)知道如何創(chuàng)建一個Git服務(wù)器了。設(shè)計Git的方式,你創(chuàng)建或者克隆一個倉庫時,你已經(jīng)創(chuàng)建了一半服務(wù)器。使能SSH訪問倉庫,并且任何訪問你倉庫的人都可以使用你的回購協(xié)議作為一個新克隆的基礎(chǔ)。

  但是,會有一個小特設(shè)。有些計劃你可以構(gòu)建關(guān)于同樣數(shù)量的精心設(shè)計的Git服務(wù)器,但是可以具有更好擴(kuò)展性。

  首先是:識別你的用戶,包括閑雜與未來的。假如你是唯一用戶,那么無需任何改變,但是如果你邀請國外的貢獻(xiàn)者了,那么你應(yīng)該為開發(fā)者搭建一個貢獻(xiàn)共享系統(tǒng)平臺。

  假定你有一個可用的服務(wù)器(如果不是,Git無法解決這個問題,但是運行在Raspberry Pi 3 的CentOS將會是一個良好開端),第一步是采用SSH鍵值授權(quán)登錄,它比密碼登錄更加強(qiáng)大,因為它能免疫于蠻力攻擊,并且可以避免用戶盡可能簡單地刪除它們的鍵值。

  在你啟用了SSH密鑰認(rèn)證之后,就創(chuàng)建一個 gituser用戶。這是一個提供給所有通過了認(rèn)證的用戶的共享用戶賬號:

  1$ su -c 'adduser gituser'

  然后切換到這個用戶,并使用合適的權(quán)限創(chuàng)建一個 ~/.ssh 框架。這非常重要,因為如果權(quán)限設(shè)置太過于隨意,你自己針對SSH的防護(hù)默認(rèn)就會失效。

  1$ su - gituser

  2$ mkdir .ssh && chmod 700 .ssh

  3$ touch .ssh/authorized_keys

  4$ chmod 600 .ssh/authorized_keys

  authorized_keys 文件里面有所有你賦予其權(quán)限操作你的Git工程的開發(fā)者的SSH公共密鑰。你的開發(fā)者必須創(chuàng)建屬于他們自己的SSH密鑰并將其中的公共密鑰發(fā)送給你。要把這些公共密鑰復(fù)制到gituser的 authorized_keys 文件中去。例如,對于一個叫做Bob的開發(fā)者,可以運行這些命令:

  1$ cat ~/path/to/id_rsa.bob.pub >> \

  2/home/gituser/.ssh/authorized_keys

  當(dāng)開發(fā)者Bob持有能匹配他發(fā)送給你的公共密鑰的私有密鑰時,他就能以gituser訪問服務(wù)器。

  不過,你并不會真的想讓你的開發(fā)者訪問到服務(wù)器,即使只是以gituser用戶來進(jìn)行訪問。你想要的是讓他們只能訪問到Git資源庫。因為這個原因,Git提供了一個受限的shell,恰如其分的將其稱為 git-shell、以root用戶運行下面的這些命令可以將git-shell添加到你的系統(tǒng)中,并使其成為gituser用戶的默認(rèn)shell:

  1# grep git-shell /etc/shells || su -c \

  2"echo `which git-shell` >> /etc/shells"

  3# su -c 'usermod -s git-shell gituser'

  現(xiàn)在gituser只能使用SSH來向Git資源庫進(jìn)行推送和拉取操作,而不能訪問到一個登陸shell。你應(yīng)該將你自己加入gituser對應(yīng)的用戶組,在我們的示例服務(wù)器中它還是gituser。

  例如:

  1# usermod -a -G gituser seth

  剩下的唯一一個步驟就是創(chuàng)建一個Git資源庫。因為不會有人在服務(wù)器上跟它進(jìn)行直接交互(也就是說你不會通過SSH連上服務(wù)器然后直接在資源庫中進(jìn)行操作), 這使其成為了一個基礎(chǔ)的資源庫。如果你想要把服務(wù)器上的資源庫用起來,就要將其從它所在的地方克隆到自己的home目錄中去。

  嚴(yán)格來說,你并不用使其成為一個基礎(chǔ)資源庫,它還是可以作為一個普通的資源庫來操作的。不過,一個基礎(chǔ)資源庫是沒有*工作樹(working tree)* (也就是說,不會有分支會處在”checkout“狀態(tài))。這很重要,因為遠(yuǎn)程用戶不會被允許向一個活動分支進(jìn)行推送 (你是不會想在一個”dev“分支工作時突然有人將變更推送到你的工作空間的?)。因為基礎(chǔ)資源庫不能有活動分支,那就不會有問題發(fā)生了。

  你可以將資源庫放到任何你想要放置的地方, 只要你想賦予權(quán)限的用戶和組也能訪問到它就行了。你不會想將目錄存儲到一個用戶的home目錄的,因為這里的權(quán)限相當(dāng)?shù)貒?yán)格, 而是要放在一個通用共享的位置,例如 /opt or /usr/local/share.

  以root用戶創(chuàng)建一個基礎(chǔ)資源庫:

  1# git init --bare /opt/jupiter.git

  2# chown -R gituser:gituser /opt/jupiter.git

  3# chmod -R 770 /opt/jupiter.git

  現(xiàn)在任何已gituser認(rèn)證的、或者是位于gituser分組的用戶都可以讀取和寫入jupiter.git資源庫。你可以在自己本機(jī)上試試看:

  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密鑰導(dǎo)入gituser用戶的 authorized_keys 文件, 或者是擁有服務(wù)器上面的賬戶(就像你一樣), 那樣的話他們就必須是gituser組的成員。

  Git鉤子

  運行你自己的Git服務(wù)器帶來的一個好處是它提供了Git鉤子。Git托管服務(wù)有時也提供了一個類似鉤子的接口,但那并不是真正的可以訪問文件系統(tǒng)的Git鉤子。一個Git鉤子是一個腳本,它在Git進(jìn)程中的某個時刻執(zhí)行。在一個倉庫(repository)接受一個提交(commit)之前,或者收到一個提交之后,或者接收一個推送(push)之前,或者收到一個推送之后等時刻執(zhí)行一個鉤子。

  這個系統(tǒng)很簡單:任何可執(zhí)行的腳本都存放在.git/hooks目錄中,使用標(biāo)準(zhǔn)的命名方案,并且在某個指定的時刻執(zhí)行。腳本執(zhí)行的時間由名字來決定;pre-push腳本在推送之前執(zhí)行,post-receive腳本在收到一個提交之后執(zhí)行,諸如此類。它基本上屬于自文檔(self-documenting)。

  可以使用任何語言編寫鉤子腳本;如果你能在你的系統(tǒng)上運行某種語言的hello world腳本,那么你就可以使用那門語言來編寫Git鉤子腳本。默認(rèn)情況下,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

  現(xiàn)在進(jìn)行測試:

  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鉤子用法是自動推送改變部分到工作生產(chǎn)中的web服務(wù)器目錄。這是一個偉大構(gòu)建FTP的方式,保留開發(fā)環(huán)節(jié)的全版本控制,并且整合、自動化發(fā)布內(nèi)容。

  如果正確執(zhí)行,它將會工作運行良好,在某一種程度來說,一直應(yīng)該做的是考慮如何網(wǎng)絡(luò)發(fā)布。它是不錯的。我不知道最初是誰想出這主意的,但是我第一次是從EMacs和來自IBM公司的Git-mentor、Bill Von Hagen那里聽到的。他的文章仍然是對這個過程起決定性作用的介紹:Git 改變分布式Web開發(fā)規(guī)則。

  Git變量

  每個Git鉤子獲取一組不同的Git動作觸發(fā)它的相關(guān)變量。你可能會用到這些變量,也可能用不到。這取決于你所寫的作品。 如果你想要的是一個普通的郵件來通知你,有人推了東西。那么你不需要細(xì)節(jié),也不需要腳本,因為你可以套用現(xiàn)有的樣板。如果你想在郵件里瀏覽別人提交的信息和作者,那么對你的腳本要求更高。

  Git鉤子并不是用戶直接運行的,所以要理解透如何獲取這些混亂卻重要的信息。事實上,一個Git鉤子腳本與其他任何腳本類似,像BASH、Python、C++或者其他腳本一樣的方式接受來自stdin的參數(shù)。不同的是,我們不會提供自己入?yún)ⅲ允褂盟鼤r要弄清楚你想要的是什么(參數(shù))。

  編寫一個Git鉤子之前,可以進(jìn)入到你的項目目錄.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進(jìn)行更多地了解,或者編寫一個簡單的腳本,輸出$1、$2、$3等。

  分支檢測范例

  我發(fā)現(xiàn)在實際的生產(chǎn)中對鉤子最常見的需求是針對受影響的分支觸發(fā)特定的事件。下面這個例子演示了如何解決這樣的任務(wù)。

  首先,Git鉤子本身不是版本控制。也就是說,Git不會跟蹤它自己的鉤子,因為Git鉤子是Git的組成部分而不是你的倉庫的一部分。因此,Git鉤子在監(jiān)視提交和推送的同時,可能對你的Git服務(wù)器上的遠(yuǎn)程倉庫最有意義,而不是作為你的本地倉庫的一部分。

  我們來編寫一個基于post-receive運行的鉤子(即,收到一個提交之后)。第一步是識別分支名字:

  1#!/bin/tcsh

  2foreach arg ( $< )

  3set argv = ( $arg )

  4set refname = $1

  5end

  for循環(huán)讀第一個參數(shù)($1),然后再次循環(huán)讀入第二個參數(shù)值($2),接著用第三個參數(shù)($3)再次循環(huán)。在Bash中有更好的方式:使用read命令,將這些值放入一個數(shù)組。但是,這里使用的是tcsh,并且變量順序是預(yù)先定義好的,這樣做要安全些。

  當(dāng)有即將提交的refname時,我們可以使用Git來獲取可讀性的分支名:

  1set branch = `git rev-parse --symbolic --abbrev-ref $refname`

  2echo $branch #DEBUG

  這時我們可以將分支名與基于動作名的關(guān)鍵字進(jìn)行比較:

  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í)行權(quán)限:

  1$ chmod +x ~/jupiter/.git/hooks/post-receive

  當(dāng)用戶提交代碼到主服務(wù)器上的分支時,這些代碼會被復(fù)制到生產(chǎn)環(huán)境的目錄中,當(dāng)代碼提交到開發(fā)環(huán)境上的分支時,這些代碼會被復(fù)制到其它地方,而提交到其它任何分支上時不會觸發(fā)復(fù)制的操作。

  檢測某人是否正在嘗試將代碼提交到本不應(yīng)該提交的分支上,或解析提交準(zhǔn)許日志,等等的這些操作都像預(yù)提交腳本一樣簡單。

  Git的鉤子(Hooks)能夠處理復(fù)雜的事情,同時它通過利用Git工作的抽象層讓人費解,但它是一個強(qiáng)大的系統(tǒng),允許你設(shè)計所有Git基礎(chǔ)設(shè)施中的動作。如果你只是想要熟悉這個過程,那你可以簡單研究一下,如果你是一個嚴(yán)格的Git用戶或是全職的Git管理員,那你得要深研了!

  在接下來的也就是此系列最后一篇文章,我們將學(xué)習(xí)怎么通過Git來管理非文本的大文件,如音頻文件、圖像文件。

  
看了“liunx ssh命令詳解”還想看:

1.Linux系統(tǒng)中SSH命令的使用教程

2.linux命令ssh遠(yuǎn)程登錄命令簡單實例

3.linux命令 ssh使用解析

4.Linux命令SSH在本地執(zhí)行遠(yuǎn)程機(jī)器上的命令

5.ssh遠(yuǎn)程執(zhí)行命令方法和Shell腳本實例

、等。

  分支檢測范例

  我發(fā)現(xiàn)在實際的生產(chǎn)中對鉤子最常見的需求是針對受影響的分支觸發(fā)特定的事件。下面這個例子演示了如何解決這樣的任務(wù)。

  首先,Git鉤子本身不是版本控制。也就是說,Git不會跟蹤它自己的鉤子,因為Git鉤子是Git的組成部分而不是你的倉庫的一部分。因此,Git鉤子在監(jiān)視提交和推送的同時,可能對你的Git服務(wù)器上的遠(yuǎn)程倉庫最有意義,而不是作為你的本地倉庫的一部分。

  我們來編寫一個基于post-receive運行的鉤子(即,收到一個提交之后)。第一步是識別分支名字:

  1#!/bin/tcsh

  2foreach arg ( $< )

  3set argv = ( $arg )

  4set refname = class="main">

liunx ssh命令詳解

時間: 志藝942 分享

  5end

  for循環(huán)讀第一個參數(shù)( class="main">

liunx ssh命令詳解

時間: 志藝942 分享
  我們將開始學(xué)習(xí)如何構(gòu)建一個Git服務(wù)器,如何在具體的事件中寫一個針對特定的觸發(fā)操作的自定義Git(例如通告),如何發(fā)布你的代碼到一個網(wǎng)站。接下來是小編為大家收集的liunx ssh命令詳解,歡迎大家閱讀:

  liunx ssh命令詳解

  目前為止,用戶對Git的焦點主要在Git的使用上。這篇文章中,我將論述如何管理Git以及自定Git架構(gòu)的設(shè)計。你可能會覺得這聽起來像“先進(jìn)的Git技術(shù)”或者“如果你是學(xué)霸讀這篇文章”的委婉說法,但是事實上理解Git如何工作不需要任何的高深知識或者專業(yè)培訓(xùn),在一些情況下只需要了解一點Linux。分享Git服務(wù)

  創(chuàng)建自己的Git服務(wù)共享非常簡單, 在許多情況下值得去創(chuàng)建這樣一個Git服務(wù)。它不僅保證你隨時可以訪問你的代碼,它的無限制數(shù)據(jù)存儲、持續(xù)集成跟部署同時為個人Git管理打開了一道Git延伸與拓展的大門。

  假如你知道如何使用Git和SSH,那么你已經(jīng)知道如何創(chuàng)建一個Git服務(wù)器了。設(shè)計Git的方式,你創(chuàng)建或者克隆一個倉庫時,你已經(jīng)創(chuàng)建了一半服務(wù)器。使能SSH訪問倉庫,并且任何訪問你倉庫的人都可以使用你的回購協(xié)議作為一個新克隆的基礎(chǔ)。

  但是,會有一個小特設(shè)。有些計劃你可以構(gòu)建關(guān)于同樣數(shù)量的精心設(shè)計的Git服務(wù)器,但是可以具有更好擴(kuò)展性。

  首先是:識別你的用戶,包括閑雜與未來的。假如你是唯一用戶,那么無需任何改變,但是如果你邀請國外的貢獻(xiàn)者了,那么你應(yīng)該為開發(fā)者搭建一個貢獻(xiàn)共享系統(tǒng)平臺。

  假定你有一個可用的服務(wù)器(如果不是,Git無法解決這個問題,但是運行在Raspberry Pi 3 的CentOS將會是一個良好開端),第一步是采用SSH鍵值授權(quán)登錄,它比密碼登錄更加強(qiáng)大,因為它能免疫于蠻力攻擊,并且可以避免用戶盡可能簡單地刪除它們的鍵值。

  在你啟用了SSH密鑰認(rèn)證之后,就創(chuàng)建一個 gituser用戶。這是一個提供給所有通過了認(rèn)證的用戶的共享用戶賬號:

  1$ su -c 'adduser gituser'

  然后切換到這個用戶,并使用合適的權(quán)限創(chuàng)建一個 ~/.ssh 框架。這非常重要,因為如果權(quán)限設(shè)置太過于隨意,你自己針對SSH的防護(hù)默認(rèn)就會失效。

  1$ su - gituser

  2$ mkdir .ssh && chmod 700 .ssh

  3$ touch .ssh/authorized_keys

  4$ chmod 600 .ssh/authorized_keys

  authorized_keys 文件里面有所有你賦予其權(quán)限操作你的Git工程的開發(fā)者的SSH公共密鑰。你的開發(fā)者必須創(chuàng)建屬于他們自己的SSH密鑰并將其中的公共密鑰發(fā)送給你。要把這些公共密鑰復(fù)制到gituser的 authorized_keys 文件中去。例如,對于一個叫做Bob的開發(fā)者,可以運行這些命令:

  1$ cat ~/path/to/id_rsa.bob.pub >> \

  2/home/gituser/.ssh/authorized_keys

  當(dāng)開發(fā)者Bob持有能匹配他發(fā)送給你的公共密鑰的私有密鑰時,他就能以gituser訪問服務(wù)器。

  不過,你并不會真的想讓你的開發(fā)者訪問到服務(wù)器,即使只是以gituser用戶來進(jìn)行訪問。你想要的是讓他們只能訪問到Git資源庫。因為這個原因,Git提供了一個受限的shell,恰如其分的將其稱為 git-shell、以root用戶運行下面的這些命令可以將git-shell添加到你的系統(tǒng)中,并使其成為gituser用戶的默認(rèn)shell:

  1# grep git-shell /etc/shells || su -c \

  2"echo `which git-shell` >> /etc/shells"

  3# su -c 'usermod -s git-shell gituser'

  現(xiàn)在gituser只能使用SSH來向Git資源庫進(jìn)行推送和拉取操作,而不能訪問到一個登陸shell。你應(yīng)該將你自己加入gituser對應(yīng)的用戶組,在我們的示例服務(wù)器中它還是gituser。

  例如:

  1# usermod -a -G gituser seth

  剩下的唯一一個步驟就是創(chuàng)建一個Git資源庫。因為不會有人在服務(wù)器上跟它進(jìn)行直接交互(也就是說你不會通過SSH連上服務(wù)器然后直接在資源庫中進(jìn)行操作), 這使其成為了一個基礎(chǔ)的資源庫。如果你想要把服務(wù)器上的資源庫用起來,就要將其從它所在的地方克隆到自己的home目錄中去。

  嚴(yán)格來說,你并不用使其成為一個基礎(chǔ)資源庫,它還是可以作為一個普通的資源庫來操作的。不過,一個基礎(chǔ)資源庫是沒有*工作樹(working tree)* (也就是說,不會有分支會處在”checkout“狀態(tài))。這很重要,因為遠(yuǎn)程用戶不會被允許向一個活動分支進(jìn)行推送 (你是不會想在一個”dev“分支工作時突然有人將變更推送到你的工作空間的?)。因為基礎(chǔ)資源庫不能有活動分支,那就不會有問題發(fā)生了。

  你可以將資源庫放到任何你想要放置的地方, 只要你想賦予權(quán)限的用戶和組也能訪問到它就行了。你不會想將目錄存儲到一個用戶的home目錄的,因為這里的權(quán)限相當(dāng)?shù)貒?yán)格, 而是要放在一個通用共享的位置,例如 /opt or /usr/local/share.

  以root用戶創(chuàng)建一個基礎(chǔ)資源庫:

  1# git init --bare /opt/jupiter.git

  2# chown -R gituser:gituser /opt/jupiter.git

  3# chmod -R 770 /opt/jupiter.git

  現(xiàn)在任何已gituser認(rèn)證的、或者是位于gituser分組的用戶都可以讀取和寫入jupiter.git資源庫。你可以在自己本機(jī)上試試看:

  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密鑰導(dǎo)入gituser用戶的 authorized_keys 文件, 或者是擁有服務(wù)器上面的賬戶(就像你一樣), 那樣的話他們就必須是gituser組的成員。

  Git鉤子

  運行你自己的Git服務(wù)器帶來的一個好處是它提供了Git鉤子。Git托管服務(wù)有時也提供了一個類似鉤子的接口,但那并不是真正的可以訪問文件系統(tǒng)的Git鉤子。一個Git鉤子是一個腳本,它在Git進(jìn)程中的某個時刻執(zhí)行。在一個倉庫(repository)接受一個提交(commit)之前,或者收到一個提交之后,或者接收一個推送(push)之前,或者收到一個推送之后等時刻執(zhí)行一個鉤子。

  這個系統(tǒng)很簡單:任何可執(zhí)行的腳本都存放在.git/hooks目錄中,使用標(biāo)準(zhǔn)的命名方案,并且在某個指定的時刻執(zhí)行。腳本執(zhí)行的時間由名字來決定;pre-push腳本在推送之前執(zhí)行,post-receive腳本在收到一個提交之后執(zhí)行,諸如此類。它基本上屬于自文檔(self-documenting)。

  可以使用任何語言編寫鉤子腳本;如果你能在你的系統(tǒng)上運行某種語言的hello world腳本,那么你就可以使用那門語言來編寫Git鉤子腳本。默認(rèn)情況下,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

  現(xiàn)在進(jìn)行測試:

  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鉤子用法是自動推送改變部分到工作生產(chǎn)中的web服務(wù)器目錄。這是一個偉大構(gòu)建FTP的方式,保留開發(fā)環(huán)節(jié)的全版本控制,并且整合、自動化發(fā)布內(nèi)容。

  如果正確執(zhí)行,它將會工作運行良好,在某一種程度來說,一直應(yīng)該做的是考慮如何網(wǎng)絡(luò)發(fā)布。它是不錯的。我不知道最初是誰想出這主意的,但是我第一次是從EMacs和來自IBM公司的Git-mentor、Bill Von Hagen那里聽到的。他的文章仍然是對這個過程起決定性作用的介紹:Git 改變分布式Web開發(fā)規(guī)則。

  Git變量

  每個Git鉤子獲取一組不同的Git動作觸發(fā)它的相關(guān)變量。你可能會用到這些變量,也可能用不到。這取決于你所寫的作品。 如果你想要的是一個普通的郵件來通知你,有人推了東西。那么你不需要細(xì)節(jié),也不需要腳本,因為你可以套用現(xiàn)有的樣板。如果你想在郵件里瀏覽別人提交的信息和作者,那么對你的腳本要求更高。

  Git鉤子并不是用戶直接運行的,所以要理解透如何獲取這些混亂卻重要的信息。事實上,一個Git鉤子腳本與其他任何腳本類似,像BASH、Python、C++或者其他腳本一樣的方式接受來自stdin的參數(shù)。不同的是,我們不會提供自己入?yún)ⅲ允褂盟鼤r要弄清楚你想要的是什么(參數(shù))。

  編寫一個Git鉤子之前,可以進(jìn)入到你的項目目錄.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進(jìn)行更多地了解,或者編寫一個簡單的腳本,輸出$1、$2、$3等。

  分支檢測范例

  我發(fā)現(xiàn)在實際的生產(chǎn)中對鉤子最常見的需求是針對受影響的分支觸發(fā)特定的事件。下面這個例子演示了如何解決這樣的任務(wù)。

  首先,Git鉤子本身不是版本控制。也就是說,Git不會跟蹤它自己的鉤子,因為Git鉤子是Git的組成部分而不是你的倉庫的一部分。因此,Git鉤子在監(jiān)視提交和推送的同時,可能對你的Git服務(wù)器上的遠(yuǎn)程倉庫最有意義,而不是作為你的本地倉庫的一部分。

  我們來編寫一個基于post-receive運行的鉤子(即,收到一個提交之后)。第一步是識別分支名字:

  1#!/bin/tcsh

  2foreach arg ( $< )

  3set argv = ( $arg )

  4set refname = $1

  5end

  for循環(huán)讀第一個參數(shù)($1),然后再次循環(huán)讀入第二個參數(shù)值($2),接著用第三個參數(shù)($3)再次循環(huán)。在Bash中有更好的方式:使用read命令,將這些值放入一個數(shù)組。但是,這里使用的是tcsh,并且變量順序是預(yù)先定義好的,這樣做要安全些。

  當(dāng)有即將提交的refname時,我們可以使用Git來獲取可讀性的分支名:

  1set branch = `git rev-parse --symbolic --abbrev-ref $refname`

  2echo $branch #DEBUG

  這時我們可以將分支名與基于動作名的關(guān)鍵字進(jìn)行比較:

  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í)行權(quán)限:

  1$ chmod +x ~/jupiter/.git/hooks/post-receive

  當(dāng)用戶提交代碼到主服務(wù)器上的分支時,這些代碼會被復(fù)制到生產(chǎn)環(huán)境的目錄中,當(dāng)代碼提交到開發(fā)環(huán)境上的分支時,這些代碼會被復(fù)制到其它地方,而提交到其它任何分支上時不會觸發(fā)復(fù)制的操作。

  檢測某人是否正在嘗試將代碼提交到本不應(yīng)該提交的分支上,或解析提交準(zhǔn)許日志,等等的這些操作都像預(yù)提交腳本一樣簡單。

  Git的鉤子(Hooks)能夠處理復(fù)雜的事情,同時它通過利用Git工作的抽象層讓人費解,但它是一個強(qiáng)大的系統(tǒng),允許你設(shè)計所有Git基礎(chǔ)設(shè)施中的動作。如果你只是想要熟悉這個過程,那你可以簡單研究一下,如果你是一個嚴(yán)格的Git用戶或是全職的Git管理員,那你得要深研了!

  在接下來的也就是此系列最后一篇文章,我們將學(xué)習(xí)怎么通過Git來管理非文本的大文件,如音頻文件、圖像文件。

  
看了“liunx ssh命令詳解”還想看:

1.Linux系統(tǒng)中SSH命令的使用教程

2.linux命令ssh遠(yuǎn)程登錄命令簡單實例

3.linux命令 ssh使用解析

4.Linux命令SSH在本地執(zhí)行遠(yuǎn)程機(jī)器上的命令

5.ssh遠(yuǎn)程執(zhí)行命令方法和Shell腳本實例

),接著用第三個參數(shù)()再次循環(huán)。在Bash中有更好的方式:使用read命令,將這些值放入一個數(shù)組。但是,這里使用的是tcsh,并且變量順序是預(yù)先定義好的,這樣做要安全些。

  當(dāng)有即將提交的refname時,我們可以使用Git來獲取可讀性的分支名:

  1set branch = `git rev-parse --symbolic --abbrev-ref $refname`

  2echo $branch #DEBUG

  這時我們可以將分支名與基于動作名的關(guān)鍵字進(jìn)行比較:

  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í)行權(quán)限:

  1$ chmod +x ~/jupiter/.git/hooks/post-receive

  當(dāng)用戶提交代碼到主服務(wù)器上的分支時,這些代碼會被復(fù)制到生產(chǎn)環(huán)境的目錄中,當(dāng)代碼提交到開發(fā)環(huán)境上的分支時,這些代碼會被復(fù)制到其它地方,而提交到其它任何分支上時不會觸發(fā)復(fù)制的操作。

  檢測某人是否正在嘗試將代碼提交到本不應(yīng)該提交的分支上,或解析提交準(zhǔn)許日志,等等的這些操作都像預(yù)提交腳本一樣簡單。

  Git的鉤子(Hooks)能夠處理復(fù)雜的事情,同時它通過利用Git工作的抽象層讓人費解,但它是一個強(qiáng)大的系統(tǒng),允許你設(shè)計所有Git基礎(chǔ)設(shè)施中的動作。如果你只是想要熟悉這個過程,那你可以簡單研究一下,如果你是一個嚴(yán)格的Git用戶或是全職的Git管理員,那你得要深研了!

  在接下來的也就是此系列最后一篇文章,我們將學(xué)習(xí)怎么通過Git來管理非文本的大文件,如音頻文件、圖像文件。

  
看了“liunx ssh命令詳解”還想看:

1.Linux系統(tǒng)中SSH命令的使用教程

2.linux命令ssh遠(yuǎn)程登錄命令簡單實例

3.linux命令 ssh使用解析

4.Linux命令SSH在本地執(zhí)行遠(yuǎn)程機(jī)器上的命令

5.ssh遠(yuǎn)程執(zhí)行命令方法和Shell腳本實例

2961526