?
? ????? PHP ??? ???? ??? ?? ??
gitweb - Git web界面(Git倉庫的前端)
要開始使用gitweb,請從Git存儲庫運行git-instaweb [1]。這將配置并啟動您的Web服務器,并運行Web瀏覽器指向gitweb。
Gitweb為Git存儲庫提供了一個Web界面。其功能包括:
使用公共根查看多個Git存儲庫。
瀏覽版本庫的每個版本。
在任何修訂版中查看存儲庫中文件的內容。
查看分支的修訂日志,文件和目錄的歷史記錄,查看什么時候由誰改變。
查看任何文件的責任/注釋詳細信息(如果啟用)。
為任何分支生成提交的RSS和Atom提要。這些供稿在現代網絡瀏覽器中可自動發(fā)現。
查看修訂版本中更改的所有內容,并逐個查看修訂版本,查看版本庫的歷史記錄。
查找提交的消息與提供的搜索詞匹配的提交。
gitweb的行為的各個方面可以通過配置文件gitweb_config.perl
或/etc/gitweb.conf
。有關詳細信息,請參閱gitweb.conf [5]。
Gitweb可以顯示來自一個或多個Git存儲庫的信息。這些存儲庫必須全部在本地文件系統上,并且必須共享公共存儲庫的根目錄,即全部位于單個父存儲庫下(另請參閱“高級Web服務器設置”部分,“具有多個項目的根目錄的Web服務器配置”小節(jié))。
our $projectroot = '/path/to/parent/directory';
$projectroot
is 的默認值/pub/git
。您可以在構建gitweb時通過GITWEB_PROJECTROOT
構建配置變量來更改它。
默認情況下,所有Git倉庫$projectroot
都是可見的,并可用于gitweb。默認情況下,通過掃描$projectroot
Git存儲庫的目錄生成項目列表(對于更精確的對象數據庫; gitweb對工作區(qū)域不感興趣,并且最適合顯示“裸”存儲庫)。
gitweb中存儲庫的名稱是其$GIT_DIR
(它的對象數據庫)相對于的路徑$projectroot
。因此,存儲庫$ repo可以在“$ projectroot / $ repo”找到。
您可以通過掃描從$ projectroot開始的文件系統來找到存儲庫,而不是讓gitweb通過從$ projectroot開始掃描文件系統來找到存儲庫,您可以通過設置$projects_list
指向帶有項目列表的純文本文件(以及其他信息)來提供預先生成的可見項目列表。
該文件使用以下格式:
每行一個記錄(用于項目/存儲庫); 不支持行延續(xù)(換行符轉義)。
前導和尾隨空白被忽略。
空白分隔的字段; 任何運行的空白都可以用作字段分隔符(Perl的“ split(" ", $line)
” 規(guī)則)。
字段使用RFC 3986第2.1節(jié)(百分比編碼)中定義的修改的URI編碼,或者更確切地說,“查詢字符串編碼”(請參閱https://en.wikipedia.org/wiki/Query_string#URL_encoding),區(qū)別在于SP (“”)可以編碼為“+”(因此“+”必須也是百分比編碼的)。保留字符為:“%”(用于編碼),“+”(可用于編碼空格),Perl中定義的所有空白字符,包括SP,TAB和LF(用于分隔記錄中的字段)。
當前識別的字段是:<存儲庫路徑>存儲庫GIT_DIR的路徑,相對于$projectroot
作為存儲庫所有者顯示的<存儲庫所有者>,最好是全名或電子郵件,或兩者兼而有之
您可以TXT
直接從gitweb 使用project_index操作(項目列表頁面上的鏈接)生成項目列表索引文件; 另請參閱下面的“使用gitweb生成項目列表”一節(jié)。
示例內容:
foo.git Joe+R+Hacker+<joe@example.com>foo/bar.git O+W+Ner+<owner@example.org>
默認情況下,這個文件只控制項目列表頁面上可見的項目(注意,沒有指向正確識別的Git存儲庫的項目將不會被gitweb顯示)。即使項目在項目列表頁面上不可見,您仍然可以通過手工制作gitweb URL來查看它。通過將$strict_export
配置變量(參見gitweb.conf [5])設置為真值,您可以只允許查看也顯示在概覽頁面上的存儲庫(即只有項目列表文件中明確列出的項目才可訪問)。
我們假設GITWEB_CONFIG具有默認的Makefile值,即gitweb_config.perl
。將以下內容放入gitweb_make_index.perl
文件中:
read_config_file("gitweb_config.perl");$projects_list = $projectroot;
然后創(chuàng)建以下腳本以適合GITWEB_LIST構建配置變量(或$projects_list
gitweb config中的變量)的格式獲取項目列表:
#!/bin/shexport GITWEB_CONFIG="gitweb_make_index.perl"export GATEWAY_INTERFACE="CGI/1.1"export HTTP_ACCEPT="*/*"export REQUEST_METHOD="GET"export QUERY_STRING="a=project_index"perl -- /var/www/cgi-bin/gitweb.cgi
運行該腳本并將其輸出保存到文件中。這個文件然后可以用作項目列表文件,這意味著你可以設置$projects_list
它的文件名。
默認情況下,所有Git倉庫$projectroot
都是可見的,并可用于gitweb。然而,你可以配置gitweb控制對存儲庫的訪問。
如“項目列表文件格式”部分所述,您可以通過在項目列表文件中選擇性地包含存儲庫并將gitweb配置變量設置為指向它來控制哪些項目可見$projects_list
。通過$strict_export
設置,項目列表文件也可用于控制哪些存儲庫可用。
您可以將gitweb配置為僅列出并允許通過$export_ok
gitweb配置文件中的變量查看顯式導出的存儲庫; 請參閱gitweb.conf [5]手冊頁。如果它的計算結果為true,那么gitweb只有$export_ok
在它的對象數據庫中存在名為by的文件時才顯示存儲庫(如果目錄有指定的魔術文件$export_ok
)。例如默認情況下git-daemon [1](除非使用--export-all
選項)允許僅為那些具有git-daemon-export-ok
文件的存儲庫提取數據。添加我們的$ export_ok =“git-daemon-export-ok”;
使gitweb顯示,并只允許訪問那些可以通過git://
協議獲取的存儲庫。
最后,可以指定一個任意perl子例程,這個子例程會被每個資源庫調用以確定它是否可以導出。子例程接收項目(存儲庫)的絕對路徑作為其唯一參數(即“$ projectroot / $ project”)。例如,如果您使用mod_perl來運行腳本,并為您的存儲庫配置了愚蠢的HTTP協議認證,那么只有當用戶有權讀取這些文件時,才可以使用以下掛接:$ export_auth_hook = sub {use Apache2 :: SubRequest(); 使用Apache2 :: Const -compile => qw(HTTP_OK); my $ path =“$ _0 / HEAD”; 我的$ r = Apache2 :: RequestUtil->請求; my $ sub = $ r-> lookup_file($ path); 返回$子>文件名eq $路徑&& $子>狀態(tài)== Apache2 ::常量:: HTTP_OK; };
您可以通過在GIT_DIR
Git存儲庫中創(chuàng)建文件或通過設置一些repo配置變量(in GIT_DIR/config
,參見git-config [1])來配置gitweb中顯示的單個存儲庫。
您可以在存儲庫中使用以下文件:
README.html
<div>
塊元素中的gitweb項目“摘要”頁面中包含的html文件(HTML片段)。您可以使用它來獲取項目的更長描述,提供鏈接(例如項目的主頁)等。只有在XSS預防功能關閉的情況下才能識別這種情況($prevent_xss
錯誤,請參閱gitweb.conf [5]); 在未來XSS預防開啟時安全地包含自述文件的方法可能會被制定出來。
description (or gitweb.description
)
Short(簡稱為$projects_list_description_width
項目列表頁面,默認為25個字符;請參閱gitweb.conf [5])(項目庫的項目)單行描述。純文本文件; HTML將被轉義。默認設置為
Unnamed repository; edit this file to name it for gitweb.
在創(chuàng)建存儲庫期間通常安裝在模板中/usr/share/git-core/templates/
。您可以使用gitweb.description
repo配置變量,但該文件優(yōu)先。
category (or gitweb.category
)
項目的單線類別,用于在$projects_list_group_categories
啟用時對項目進行分組。默認情況下(文件和配置變量不存在),未分類的項目放在$project_list_default_category
類別中。您可以使用gitweb.category
repo配置變量,但該文件優(yōu)先。
配置變量$projects_list_group_categories
和$project_list_default_category
描述在gitweb.conf [5]
cloneurl (or multiple-valued gitweb.url
)
帶有存儲庫URL的文件(用于克隆和提取),每行一個。顯示在項目摘要頁面中。您可以使用多值gitweb.url
存儲庫配置變量,但該文件優(yōu)先。
這是每個存儲庫增強/版本的基于全局前綴的@git_base_url_list
gitweb配置變量(請參閱gitweb.conf [5])。
gitweb.owner
您可以使用gitweb.owner
存儲庫配置變量來設置存儲庫的所有者。它顯示在項目列表和摘要頁面中。
如果未設置,則使用文件系統目錄的所有者(通過GECOS字段,即來自getpwuid(3)的實名字段),如果$projects_list
未設置(gitweb掃描$projectroot
存儲庫); 如果$projects_list
指向使用存儲庫列表的文件,則項目所有者將默認為此文件對給定存儲庫的值。
various gitweb.*
config variables (in config)
閱讀%feature
哈希的詳細列表和描述。另請參閱gitweb.conf中的“配置gitweb功能”部分[5]
Gitweb可以使用基于URL的path_info(組件),或者它可以通過查詢參數傳遞所有必要的信息。典型的gitweb網址分為五個部分:
.../gitweb.cgi/<repo>/<action>/<revision>:/<path>?<arguments>
回購
操作將在其上執(zhí)行的存儲庫。
除了列出所有可用項目的所有操作(無論采用何種形式),都需要此參數。
action
將要運行的操作。默認為projects_list
如果沒有設置回購,summary
否則。
調整
顯示修訂。默認為HEAD。
path
執(zhí)行操作的<repository>中的路徑,用于需要它的操作。
arguments
任何控制動作行為的參數。
某些操作需要或允許指定兩個修訂版本,有時甚至包含兩個路徑名。在大多數通用形式中,這樣的基于路徑信息(組件)的gitweb URL看起來像這樣:
.../gitweb.cgi/<repo>/<action>/<revision_from>:/<path_from>..<revision_to>:/<path_to>?<arguments>
每個動作都以子例程的形式實現,并且必須存在于%動作哈希中。某些操作默認情況下處于禁用狀態(tài),必須通過功能機制啟用。例如,要啟用blame
視圖,請將以下內容添加到gitweb配置文件中:
$feature{'blame'}{'default'} = [1];
標準行動是:
project_list
列出可用的Git存儲庫。如果在URL中未指定存儲庫,則這是默認命令。
summary
顯示關于給定存儲庫的摘要 如果在URL中沒有指定操作,則這是默認命令,并且只指定存儲庫。
heads remotes
列出給定存儲庫中的所有本地或全部遠程跟蹤分支。
后者默認情況下不可用,除非已配置。
tags
列出給定存儲庫中的所有標記(輕量級和注釋)。
blob tree
在給定的版本中顯示給定存儲庫路徑中的文件和目錄。如果在URL中沒有指定任何操作,并且給出路徑,則這是默認命令。
blob_plain
在給定路徑和修訂版本中,返回給定存儲庫中文件的原始數據。此行為的鏈接已標記raw
。
blobdiff
顯示同一文件的兩個修訂之間的差異。
blame blame_incremental
顯示文件的責任(也稱為注釋)信息。在每行的基礎上,它顯示該行最后更改的版本以及提交更改的用戶。增量版本(如果啟用了JavaScript,則會自動使用該版本)使用Ajax向指定文件的內容逐漸添加責備信息。
出于性能原因,此操作默認處于禁用狀態(tài)。
提交commitdiff
顯示有關存儲庫中特定提交的信息。該commit
視圖更詳細地顯示了有關提交的信息,該commitdiff
操作顯示了給定提交的變更集。
patch
以純文本郵件格式返回提交,適用于使用git-am [1]。
tag
顯示特定的注釋標簽(標簽對象)。
log shortlog
顯示給定分支的日志信息(提交消息或僅提交主題)(從給定修訂開始)。
該shortlog
視圖是更緊湊; 它顯示每行一次提交。
history
從給定修訂(默認為HEAD,即默認分支)開始,顯示給定存儲庫路徑中文件或目錄的歷史記錄。
這種觀點與shortlog
觀點相似。
rss atom
生成對存儲庫的更改的RSS(或Atom)訂閱源。
本節(jié)介紹如何配置一些常用的Web服務器來運行gitweb。在所有情況下,/path/to/gitweb
在這些例子中是你運行gitweb并且包含的目錄gitweb_config.perl
。
如果您已經配置了一個未在此處列出的gitweb的Web服務器,請發(fā)送說明,以便它們可以包含在未來版本中。
必須將Apache配置為在安裝gitweb的目錄中支持CGI腳本。我們假設它是/var/www/cgi-bin
目錄。
ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"<Directory "/var/www/cgi-bin"> Options Indexes FollowSymlinks ExecCGI AllowOverride None Order allow,deny Allow from all</Directory>
使用該配置,瀏覽存儲庫的完整路徑是:
http://server/cgi-bin/gitweb.cgi
你可以在gitweb中使用mod_perl。您必須安裝Apache :: Registry(用于mod_perl 1.x)或ModPerl :: Registry(用于mod_perl 2.x)以啟用此支持。
假設安裝了gitweb /var/www/perl
,以下Apache配置(適用于mod_perl 2.x)是合適的。
Alias /perl "/var/www/perl"<Directory "/var/www/perl"> SetHandler perl-script PerlResponseHandler ModPerl::Registry PerlOptions +ParseHeaders Options Indexes FollowSymlinks +ExecCGI AllowOverride None Order allow,deny Allow from all</Directory>
使用該配置,瀏覽存儲庫的完整路徑是:
http://server/perl/gitweb.cgi
Gitweb與Apache和FastCGI協同工作。首先,您需要重命名,復制或將gitweb.cgi鏈接到gitweb.fcgi。假設gitweb安裝在/usr/share/gitweb
目錄中。以下Apache配置是合適的(未測試?。?/p>
FastCgiServer /usr/share/gitweb/gitweb.cgi ScriptAlias /gitweb /usr/share/gitweb/gitweb.cgi Alias /gitweb/static /usr/share/gitweb/static<Directory /usr/share/gitweb/static> SetHandler default-handler</Directory>
使用該配置,瀏覽存儲庫的完整路徑是:
http://server/gitweb
所有這些示例都使用請求重寫,并且需要mod_rewrite
(或等效;下面的示例是為Apache編寫的)。
如果你想為gitweb和你的http://
倉庫都有一個URL ,你可以像這樣配置Apache:
<VirtualHost *:80> ServerName git.example.org DocumentRoot /pub/git SetEnv GITWEB_CONFIG /etc/gitweb.conf # turning on mod rewrite RewriteEngine on # make the front page an internal rewrite to the gitweb script RewriteRule ^/$ /cgi-bin/gitweb.cgi # make access for "dumb clients" work RewriteRule ^/(.*\.git/(?!/?(HEAD|info|objects|refs)).*)?$ \ /cgi-bin/gitweb.cgi%{REQUEST_URI} [L,PT]</VirtualHost>
上面的配置希望你的公共倉庫可以作為可復制的Git URL和可瀏覽的gitweb界面一起存在/pub/git
并且將作為它們服務http://git.domain.org/dir-under-pub-git
。如果你啟動你的git-daemon [1],--base-path=/pub/git --export-all
那么你甚至可以使用git://
完全相同路徑的URL。
設置環(huán)境變量GITWEB_CONFIG
會告訴gitweb使用指定的文件(即在本例中/etc/gitweb.conf
)作為gitweb的配置。在上面的例子中,你并不需要它。只有當你的配置文件與內置不同的地方(在編譯gitweb的時候)gitweb_config.perl
或者/etc/gitweb.conf
。有關詳細信息,請參閱gitweb.conf [5],特別是有關優(yōu)先級規(guī)則的信息。
如果您使用示例中的重寫規(guī)則,則可能還需要在您的gitweb配置文件中使用/etc/gitweb.conf
以下內容(以下示例):
@stylesheets = ("/some/absolute/path/gitweb.css");$my_uri = "/";$home_link = "/";$per_request_config = 1;
現在,盡管gitweb應該在需要時創(chuàng)建HTML基本標記(為相對鏈接設置基本URI),所以它應該自動工作。
如果您想要將gitweb用于多個項目根目錄,您可以按照以下方式編輯Apache虛擬主機和gitweb配置文件。
虛擬主機配置(在Apache配置文件中)應該如下所示:
<VirtualHost *:80> ServerName git.example.org DocumentRoot /pub/git SetEnv GITWEB_CONFIG /etc/gitweb.conf # turning on mod rewrite RewriteEngine on # make the front page an internal rewrite to the gitweb script RewriteRule ^/$ /cgi-bin/gitweb.cgi [QSA,L,PT] # look for a public_git folder in unix users' home # http://git.example.org/~<user>/ RewriteRule ^/\~([^\/]+)(/|/gitweb.cgi)?$ /cgi-bin/gitweb.cgi \ [QSA,E=GITWEB_PROJECTROOT:/home/$1/public_git/,L,PT] # http://git.example.org/+<user>/ #RewriteRule ^/\+([^\/]+)(/|/gitweb.cgi)?$ /cgi-bin/gitweb.cgi \ [QSA,E=GITWEB_PROJECTROOT:/home/$1/public_git/,L,PT] # http://git.example.org/user/<user>/ #RewriteRule ^/user/([^\/]+)/(gitweb.cgi)?$ /cgi-bin/gitweb.cgi \ [QSA,E=GITWEB_PROJECTROOT:/home/$1/public_git/,L,PT] # defined list of project roots RewriteRule ^/scm(/|/gitweb.cgi)?$ /cgi-bin/gitweb.cgi \ [QSA,E=GITWEB_PROJECTROOT:/pub/scm/,L,PT] RewriteRule ^/var(/|/gitweb.cgi)?$ /cgi-bin/gitweb.cgi \ [QSA,E=GITWEB_PROJECTROOT:/var/git/,L,PT] # make access for "dumb clients" work RewriteRule ^/(.*\.git/(?!/?(HEAD|info|objects|refs)).*)?$ \ /cgi-bin/gitweb.cgi%{REQUEST_URI} [L,PT]</VirtualHost>
這里實際的項目根目錄通過GITWEB_PROJECT_ROOT
web服務器的環(huán)境變量傳遞給gitweb ,所以你需要把下面的代碼放到gitweb配置文件中(/etc/gitweb.conf
在上面的例子中):
$projectroot = $ENV{'GITWEB_PROJECTROOT'} || "/pub/git";
請注意,這需要為每個請求設置,因此要么$per_request_config
必須是false,要么上面的代碼必須放在引用的代碼中$per_request_config
;
這些配置有兩件事。首先,<user>
服務器的每個unix用戶()都能夠瀏覽通過~/public_git/
以下URL 找到的gitweb Git存儲庫:
http://git.example.org/~<user>/
如果您不想在服務器上使用此功能,只需刪除第二個重寫規(guī)則即可。
如果您已經mod_userdir
在您的虛擬主機中使用過,或者您不想使用'?'作為第一個字符,則只需評論或刪除第二個重寫規(guī)則,然后根據需要取消注釋以下內容之一。
其次,在倉庫中發(fā)現/pub/scm/
并/var/git/
會通過訪問http://git.example.org/scm/
和http://git.example.org/var/
。您可以通過添加第三和第四個重寫規(guī)則來添加任意數量的項目根目錄。
如果你通過放在gitweb中啟用PATH_INFO用法
$feature{'pathinfo'}{'default'} = [1];
在你的gitweb配置文件中,可以設置你的服務器,使它消耗并生成表單中的URL
http://git.example.com/project.git/shortlog/sometag
即沒有gitweb.cgi
部分,通過使用如下配置。此配置假定/var/www/gitweb
您的Web服務器的DocumentRoot包含gitweb.cgi腳本和補充靜態(tài)文件(stylesheet,favicon,JavaScript):
<VirtualHost *:80> ServerAlias git.example.com DocumentRoot /var/www/gitweb <Directory /var/www/gitweb> Options ExecCGI AddHandler cgi-script cgi DirectoryIndex gitweb.cgi RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^.* /gitweb.cgi/$0 [L,PT] </Directory></VirtualHost>
重寫規(guī)則保證現有的靜態(tài)文件將被正確地提供,而任何其他URL將作為PATH_INFO參數傳遞給gitweb。
請注意,在這種情況下,你不需要特殊的設置@stylesheets
,$my_uri
和$home_link
,但你失去了“啞客戶端”訪問項目的.git迪爾斯(在“同一網址的GitWeb和獲取”部分所述)。后者的一個可能的解決方法如下:在你的項目的根目錄中(例如/pub/git
)有沒有 .git擴展名的項目(例如,/pub/git/project
而不是/pub/git/project.git
),并配置Apache如下:
<VirtualHost *:80> ServerAlias git.example.com DocumentRoot /var/www/gitweb AliasMatch ^(/.*?)(\.git)(/.*)?$ /pub/git$1$3 <Directory /var/www/gitweb> Options ExecCGI AddHandler cgi-script cgi DirectoryIndex gitweb.cgi RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^.* /gitweb.cgi/$0 [L,PT] </Directory></VirtualHost>
額外的AliasMatch使其成為可能
http://git.example.com/project.git
將原始訪問該項目的Git目錄(以便項目可以克?。瑫r
http://git.example.com/project
將提供人性化的gitweb訪問。
這個解決方案并不是100%的,因為如果某個項目有一個名為ref(branch,tag)的開頭git/
,那么路徑如
http://git.example.com/project/command/abranch..git/abranch
將失敗并出現404錯誤。
請將任何錯誤或功能請求報告給git@vger.kernel.org,將“gitweb”放在電子郵件主題中。