久久亚洲私人国产精品vA ,亚洲 综合 国产 欧洲 丝袜,亚洲一区二区三区免费视频 http://www.tkk7.com/zqli/category/14440.html為學(xué)日益,為道日損。zh-cnTue, 27 Feb 2007 10:29:29 GMTTue, 27 Feb 2007 10:29:29 GMT60Subversion's design documents-bubble-up methodhttp://www.tkk7.com/zqli/archive/2006/11/13/80834.html放水老倌放水老倌Mon, 13 Nov 2006 02:40:00 GMThttp://www.tkk7.com/zqli/archive/2006/11/13/80834.htmlhttp://www.tkk7.com/zqli/comments/80834.htmlhttp://www.tkk7.com/zqli/archive/2006/11/13/80834.html#Feedback0http://www.tkk7.com/zqli/comments/commentRss/80834.htmlhttp://www.tkk7.com/zqli/services/trackbacks/80834.html
Bubble-Up Method

This section provides a conversational explanation of how the repository actually stores and revisions file trees. It's not critical knowledge for a programmer using the Subversion Filesystem API, but most people probably still want to know what's going on “under the hood” of the repository.

Suppose we have a new project, at revision 1, looking like this (using CVS syntax):

prompt$ svn checkout myproj
U myproj/
U myproj/B
U myproj/A
U myproj/A/fish
U myproj/A/fish/tuna
prompt$

Only the file tuna is a regular file, everything else in myproj is a directory.

Let's see what this looks like as an abstract data structure in the repository, and how that structure works in various operations (such as update, commit, and branch).

In the diagrams that follow, lines represent parent-to-child connections in a directory hierarchy. Boxes are "nodes". A node is either a file or a directory – a letter in the upper left indicates which kind. A file node has a byte-string for its content, whereas directory nodes have a list of dir_entries, each pointing to another node.

Parent-child links go both ways (i.e., a child knows who all its parents are), but a node's name is stored only in its parent, because a node with multiple parents may have different names in different parents.

At the top of the repository is an array of revision numbers, stretching off to infinity. Since the project is at revision 1, only index 1 points to anything; it points to the root node of revision 1 of the project:

                    ( myproj's revision array )
       ______________________________________________________
      |___1_______2________3________4________5_________6_____...
          |
          |
       ___|_____
      |D        |
      |         |
      |   A     |      /* Two dir_entries, `A' and `B'. */
      |    \    |
      |   B \   |
      |__/___\__|
        /     \
       |       \
       |        \
    ___|___   ___\____
   |D      | |D       |
   |       | |        |
   |       | | fish   |   /* One dir_entry, `fish'. */
   |_______| |___\____|
                  \
                   \
                 ___\____
                |D       |
                |        |
                | tuna   |  /* One dir_entry, `tuna'. */
                |___\____|
                     \
                      \
                    ___\____
                   |F       |
                   |        |
                   |        |   /* (Contents of tuna not shown.) */
                   |________|

What happens when we modify tuna and commit? First, we make a new tuna node, containing the latest text. The new node is not connected to anything yet, it's just hanging out there in space:

                         ________
                        |F       |
                        |        |
                        |        |
                        |________|

Next, we create a new revision of its parent directory:

                 ________
                |D       |
                |        |
                | tuna   |
                |___\____|
                     \
                      \
                    ___\____
                   |F       |
                   |        |
                   |        |
                   |________|

We continue up the line, creating a new revision of the next parent directory:

              ________
             |D       |
             |        |
             | fish   |
             |___\____|
                  \
                   \
                 ___\____
                |D       |
                |        |
                | tuna   |
                |___\____|
                     \
                      \
                    ___\____
                   |F       |
                   |        |
                   |        |
                   |________|

Now it gets more tricky: we need to create a new revision of the root directory. This new root directory needs an entry to point to the “new” directory A, but directory B hasn't changed at all. Therefore, our new root directory also has an entry that still points to the old directory B node!

       ______________________________________________________
      |___1_______2________3________4________5_________6_____...
          |
          |
       ___|_____             ________
      |D        |           |D       |
      |         |           |        |
      |   A     |           |   A    |
      |    \    |           |    \   |
      |   B \   |           |   B \  |
      |__/___\__|           |__/___\_|
        /     \               /     \
       |    ___\_____________/       \
       |   /    \                     \
    ___|__/   ___\____              ___\____
   |D      | |D       |            |D       |
   |       | |        |            |        |
   |       | | fish   |            | fish   |
   |_______| |___\____|            |___\____|
                  \                     \
                   \                     \
                 ___\____              ___\____
                |D       |            |D       |
                |        |            |        |
                | tuna   |            | tuna   |
                |___\____|            |___\____|
                     \                     \
                      \                     \
                    ___\____              ___\____
                   |F       |            |F       |
                   |        |            |        |
                   |        |            |        |
                   |________|            |________|

Finally, after all our new nodes are written, we finish the “bubble up” process by linking this new tree to the next available revision in the history array. In this case, the new tree becomes revision 2 in the repository.

       ______________________________________________________
      |___1_______2________3________4________5_________6_____...
          |        \
          |         \__________
       ___|_____             __\_____
      |D        |           |D       |
      |         |           |        |
      |   A     |           |   A    |
      |    \    |           |    \   |
      |   B \   |           |   B \  |
      |__/___\__|           |__/___\_|
        /     \               /     \
       |    ___\_____________/       \
       |   /    \                     \
    ___|__/   ___\____              ___\____
   |D      | |D       |            |D       |
   |       | |        |            |        |
   |       | | fish   |            | fish   |
   |_______| |___\____|            |___\____|
                  \                     \
                   \                     \
                 ___\____              ___\____
                |D       |            |D       |
                |        |            |        |
                | tuna   |            | tuna   |
                |___\____|            |___\____|
                     \                     \
                      \                     \
                    ___\____              ___\____
                   |F       |            |F       |
                   |        |            |        |
                   |        |            |        |
                   |________|            |________|

Generalizing on this example, you can now see that each “revision” in the repository history represents a root node of a unique tree (and an atomic commit to the whole filesystem.) There are many trees in the repository, and many of them share nodes.

Many nice behaviors come from this model:

  1. Easy reads. If a filesystem reader wants to locate revision X of file foo.c, it need only traverse the repository's history, locate revision X's root node, then walk down the tree to foo.c.

  2. Writers don't interfere with readers. Writers can continue to create new nodes, bubbling their way up to the top, and concurrent readers cannot see the work in progress. The new tree only becomes visible to readers after the writer makes its final “l(fā)ink” to the repository's history.

  3. File structure is versioned. Unlike CVS, the very structure of each tree is being saved from revision to revision. File and directory renames, additions, and deletions are part of the repository's history.

Let's demonstrate the last point by renaming the tuna to book.

We start by creating a new parent “fish” directory, except that this parent directory has a different dir_entry, one which points the same old file node, but has a different name:

       ______________________________________________________
      |___1_______2________3________4________5_________6_____...
          |        \
          |         \__________
       ___|_____             __\_____
      |D        |           |D       |
      |         |           |        |
      |   A     |           |   A    |
      |    \    |           |    \   |
      |   B \   |           |   B \  |
      |__/___\__|           |__/___\_|
        /     \               /     \
       |    ___\_____________/       \
       |   /    \                     \
    ___|__/   ___\____              ___\____
   |D      | |D       |            |D       |
   |       | |        |            |        |
   |       | | fish   |            | fish   |
   |_______| |___\____|            |___\____|
                  \                     \
                   \                     \
                 ___\____              ___\____      ________
                |D       |            |D       |    |D       |
                |        |            |        |    |        |
                | tuna   |            | tuna   |    | book   |
                |___\____|            |___\____|    |_/______|
                     \                     \         /
                      \                     \       /
                    ___\____              ___\____ /
                   |F       |            |F       |
                   |        |            |        |
                   |        |            |        |
                   |________|            |________|

From here, we finish with the bubble-up process. We make new parent directories up to the top, culminating in a new root directory with two dir_entries (one points to the old “B” directory node we've had all along, the other to the new revision of “A”), and finally link the new tree to the history as revision 3:

       ______________________________________________________
      |___1_______2________3________4________5_________6_____...
          |        \        \_________________
          |         \__________               \
       ___|_____             __\_____        __\_____
      |D        |           |D       |      |D       |
      |         |           |        |      |        |
      |   A     |           |   A    |      |   A    |
      |    \    |           |    \   |      |    \   |
      |   B \   |           |   B \  |      |   B \  |
      |__/___\__|           |__/___\_|      |__/___\_|
        /  ___________________/_____\_________/     \
       |  / ___\_____________/       \               \
       | / /    \                     \               \
    ___|/_/   ___\____              ___\____      _____\__
   |D      | |D       |            |D       |    |D       |
   |       | |        |            |        |    |        |
   |       | | fish   |            | fish   |    | fish   |
   |_______| |___\____|            |___\____|    |___\____|
                  \                     \             \
                   \                     \             \
                 ___\____              ___\____      ___\____
                |D       |            |D       |    |D       |
                |        |            |        |    |        |
                | tuna   |            | tuna   |    | book   |
                |___\____|            |___\____|    |_/______|
                     \                     \         /
                      \                     \       /
                    ___\____              ___\____ /
                   |F       |            |F       |
                   |        |            |        |
                   |        |            |        |
                   |________|            |________|

For our last example, we'll demonstrate the way “tags” and “branches” are implemented in the repository.

In a nutshell, they're one and the same thing. Because nodes are so easily shared, we simply create a new directory entry that points to an existing directory node. It's an extremely cheap way of copying a tree; we call this new entry a clone, or more colloquially, a “cheap copy”.

Let's go back to our original tree, assuming that we're at revision 6 to begin with:

       ______________________________________________________
    ...___6_______7________8________9________10_________11_____...
          |
          |
       ___|_____
      |D        |
      |         |
      |   A     |
      |    \    |
      |   B \   |
      |__/___\__|
        /     \
       |       \
       |        \
    ___|___   ___\____
   |D      | |D       |
   |       | |        |
   |       | | fish   |
   |_______| |___\____|
                  \
                   \
                 ___\____
                |D       |
                |        |
                | tuna   |
                |___\____|
                     \
                      \
                    ___\____
                   |F       |
                   |        |
                   |        |
                   |________|

Let's “tag” directory A. To make the clone, we create a new dir_entry T in our root, pointing to A's node:

       ______________________________________________________
      |___6_______7________8________9________10_________11_____...
          |        \
          |         \
       ___|_____   __\______
      |D        | |D        |
      |         | |         |
      |   A     | |    A    |
      |    \    | |    |    |
      |   B \   | |  B |  T |
      |__/___\__| |_/__|__|_|
        /     \    /   |  |
       |    ___\__/   /  /
       |   /    \    /  /
    ___|__/   ___\__/_ /
   |D      | |D       |
   |       | |        |
   |       | | fish   |
   |_______| |___\____|
                  \
                   \
                 ___\____
                |D       |
                |        |
                | tuna   |
                |___\____|
                     \
                      \
                    ___\____
                   |F       |
                   |        |
                   |        |
                   |________|

Now we're all set. In the future, the contents of directories A and B may change quite a lot. However, assuming we never make any changes to directory T, it will always point to a particular pristine revision of directory A at some point in time. Thus, T is a tag.

(In theory, we can use some kind of authorization system to prevent anyone from writing to directory T. In practice, a well-laid out repository should encourage “tag directories” to live in one place, so that it's clear to all users that they're not meant to change.)

However, if we do decide to allow commits in directory T, and now our repository tree increments to revision 8, then T becomes a branch. Specifically, it's a branch of directory A which shares history with A up to a certain point, and then “broke off” from the main line at revision 8.

License — Copyright

Copyright ? 2000-2006 Collab.Net. All rights reserved.

This software is licensed as described in the file COPYING, which you should have received as part of this distribution. The terms are also available at http://subversion.tigris.org/license-1.html. If newer versions of this license are posted there, you may use a newer version instead, at your option.

track:http://subversion.tigris.org/design.html#server.fs.struct.bubble-up



放水老倌 2006-11-13 10:40 發(fā)表評(píng)論
]]>
[轉(zhuǎn)]manpage of htpasswdhttp://www.tkk7.com/zqli/archive/2006/08/29/66366.html放水老倌放水老倌Tue, 29 Aug 2006 02:30:00 GMThttp://www.tkk7.com/zqli/archive/2006/08/29/66366.htmlhttp://www.tkk7.com/zqli/comments/66366.htmlhttp://www.tkk7.com/zqli/archive/2006/08/29/66366.html#Feedback0http://www.tkk7.com/zqli/comments/commentRss/66366.htmlhttp://www.tkk7.com/zqli/services/trackbacks/66366.htmlNAME(名稱)htpasswd - 創(chuàng)建和更新用戶認(rèn)證文件 ?

SYNOPSIS(總覽)

htpasswd [ -c ] [ -m | -d | -s | -p ] passwdfileusername
htpasswd-b [ -c ] [ -m | -d | -s | -p ] passwdfileusernamepassword?

DESCRIPTION(描述)

htpasswd 用來(lái)創(chuàng)建和更新保存著 HTTP用戶基本認(rèn)證的用戶和密碼的平面文件. 如果 htpasswd 不能訪問(wèn)文件,那么就不可能寫(xiě)入到輸出文件, 也不可能讀取文件以更新它, 它會(huì)返回錯(cuò)誤狀態(tài)并不作任何修改.

httpd Apache web服務(wù)器獲取的資源只限于由 htpasswd 創(chuàng)建的文件中所列出的用戶使用. 該程序只能用于用戶名保存在平面文件的情況下. 要使用DBM數(shù)據(jù)庫(kù),請(qǐng)參看 dbmmanage.

htpasswd 的加密密碼既可以使用針對(duì)Apache修改的MD5版本, 也可以使用系統(tǒng)的crypt()程序. 由 htpasswd 管理的文件可能同時(shí)包含兩種類型的密碼; 一些用戶記錄可使用MD5加密的密碼, 而另一些用戶記錄可在同一文件中使用通過(guò) crypt()加密的密碼.

該手冊(cè)頁(yè)只列出了命令行的參數(shù). 要獲得關(guān)于在 httpd 中配置用戶認(rèn)證的必要指令的詳細(xì)情況, 可參看Apache手冊(cè),它是Apache發(fā)布版本的一部分,你也可以在 <URL:http://www.apache.org/>上找到它. ?

OPTIONS(選項(xiàng))

-b
使用批處理模式;也即,從命令行上獲取密碼而不給出提示.該選項(xiàng)在使用時(shí)應(yīng)特別小心, 因?yàn)槊艽a是在命令行上清楚可見(jiàn)的.
-c
創(chuàng)建passwdfile.如果passwdfile 已經(jīng)存在,那么它會(huì)重新寫(xiě)入并刪去原有內(nèi)容.
-m
密碼使用Apache修改的MD5算法. 使用這種算法加密的密碼可以移植到運(yùn)行Apache 1.3.9或更新版本的任何平臺(tái)上(Windows,Unix,BeOS,等等). 在Windows和TPF上,該標(biāo)識(shí)是默認(rèn)的.
-d
密碼使用crypt()加密.這是除了Windows和TPF 之外的所有平臺(tái)上的默認(rèn)值.盡管這可被所有平臺(tái)上的 htpasswd 支持,卻不被Windows和TPF上的 httpd 服務(wù)器所支持.
-s
密碼使用SHA加密方法.這種方式移植于Netscape服務(wù)器, 使用的是LDAP目錄交換格式(ldif).
-p
使用普通文本格式的密碼.盡管 htpasswd 可支持在所有平臺(tái)上創(chuàng)建這種格式的密碼, 卻只有Windows和TPF上的 httpd 守護(hù)程序能夠接受普通文本密碼.
passwdfile
包含用戶名和密碼的文件的名字. 如果給定了-c,那么會(huì)在其不存在的情況下創(chuàng)建該文件, 或者在其存在的情況下重新寫(xiě)入并刪去原有內(nèi)容.
username
passwdfile中創(chuàng)建或更新的用戶名. 如果username在文件中不存在, 即創(chuàng)建一條記錄. 如果已經(jīng)存在,則修改其密碼.
password
文件中加密和存儲(chǔ)的普通文本格式的密碼. 只用于-b標(biāo)識(shí).
?

EXIT STATUS(退出狀態(tài))

如果在passwdfile中用戶名和密碼添加或更新成功, htpasswd 返回0狀態(tài)("true"). 如果在存取文件時(shí)遇到某些問(wèn)題 htpasswd 返回1, 如果在命令行中有語(yǔ)法錯(cuò)誤, htpasswd 返回2, 如果交互式輸入的密碼與其驗(yàn)證項(xiàng)不匹配, htpasswd 返回3, 如果操作被中斷, htpasswd 返回4, 如果某個(gè)值(用戶名,文件名,密碼或最終計(jì)算出的記錄)太長(zhǎng), htpasswd 返回5, 如果用戶名包含無(wú)效的字符(參看RESTRICTIONS部分), htpasswd 返回6. ?

EXAMPLES(示例)

htpasswd /usr/local/etc/apache/.htpasswd-users jsmith
為用戶jsmith添加或修改密碼. 會(huì)給出用戶輸入密碼的提示. 如果在Windows系統(tǒng)上執(zhí)行, 密碼會(huì)使用修改的Apache MD5算法加密; 否則,會(huì)使用系統(tǒng)的 crypt()程序. 如果文件不存在, htpasswd 會(huì)不作任何修改并返回一條錯(cuò)誤提示.

htpasswd -c /home/doe/public_html/.htpasswd jane

創(chuàng)建一個(gè)新的文件并將用戶jane記錄保存在其中. 會(huì)給出用戶輸入密碼的提示. 如果文件存在但不能夠讀取,或者不能夠?qū)懭? 那么它不會(huì)作修改,而且 htpasswd 會(huì)顯示一條消息并返回一個(gè)錯(cuò)誤狀態(tài).

htpasswd -mb /usr/web/.htpasswd-all jones Pwd4Steve

使用MD5算法加密取自命令行的密碼, 并將其保存到指定的文件中.

SECURITY CONSIDERATIONS(安全考慮)

Web密碼文件如由 htpasswd 管理的這些應(yīng)該在Web服務(wù)器的URI空間范圍之內(nèi) -- 也就是說(shuō), 瀏覽器不應(yīng)該能夠獲取他們.

建議不要使用-b選項(xiàng),因?yàn)槭褂迷撨x項(xiàng)時(shí)未加密的密碼出現(xiàn)在了命令行上. ?

RESTRICTIONS(限制)

在Windows和MPE平臺(tái)上,使用 htpasswd 加密的密碼的長(zhǎng)度限制在255個(gè)字符以內(nèi). 超出此長(zhǎng)度的密碼會(huì)取前255個(gè)字符.

使用的MD5算法是Apache軟件特有的; 使用它加密的密碼對(duì)于其他Web服務(wù)器來(lái)說(shuō)是不可用的.

用戶名限制在255個(gè)字節(jié)以內(nèi),而且不能包含字符':'. q.SH SEE ALSO(另見(jiàn)) httpd(8) 以及隨發(fā)布版本所帶的support/SHA1下的腳本.



放水老倌 2006-08-29 10:30 發(fā)表評(píng)論
]]>
Apache2+Subversion1.3.x安裝手記http://www.tkk7.com/zqli/archive/2006/08/28/66108.html放水老倌放水老倌Mon, 28 Aug 2006 02:20:00 GMThttp://www.tkk7.com/zqli/archive/2006/08/28/66108.htmlhttp://www.tkk7.com/zqli/comments/66108.htmlhttp://www.tkk7.com/zqli/archive/2006/08/28/66108.html#Feedback0http://www.tkk7.com/zqli/comments/commentRss/66108.htmlhttp://www.tkk7.com/zqli/services/trackbacks/66108.html第一次安裝Subversion,在昨天的安裝過(guò)程中,出現(xiàn)了一些問(wèn)題:
第一步,安裝Apache+Subversion
?????? 首先,我選擇了apache_2.2.3+svn-1.3.2的組合。開(kāi)始安裝Apache server就報(bào)錯(cuò),提示http.conf第133行出錯(cuò),打開(kāi)在前面加了個(gè)#,啟動(dòng)成功。接著安裝svn-1.3.2,配置好httpd.conf之后發(fā)現(xiàn)apche的服務(wù)無(wú)法啟動(dòng),說(shuō)是無(wú)法加載mod_dav_svn.so。baidu之后發(fā)現(xiàn)是svn無(wú)法在apache2.2下面安裝,其官方下載頁(yè)面也有提示說(shuō):Note that the Apache modules included in this package was compiled against Apache HTTP Server 2.0, and thus will not work with Apache HTTP Server 2.2.下載的過(guò)程中,沒(méi)注意這個(gè)東西!下次得多留意這些細(xì)節(jié)。

?????? 只好重新下載安裝apache_2.0.59版本,把Subversion/bin下面所有.dll文件復(fù)制到Apache Group\Apache2\bin下,提示有文件覆蓋,選擇不覆蓋;再將Subversion/bin下的.so文件復(fù)制到Apache Group\Apache2\modules下。

安裝Apache2.x時(shí)注意事項(xiàng):

請(qǐng)確保你輸入正確的服務(wù)器URL(如果你的服務(wù)器沒(méi)有DNS名稱,你可以直接輸入IP地址)。我建議你將Apache安裝成 for all Users,on Port 80,as a service。注意:如果你已經(jīng)有一個(gè)IIS或者其它的程序使用80端口,安裝可能會(huì)失敗。如果是這樣,你可以到程序目錄下的Apache Group\Apache2\conf目錄中找到文件httpd.conf,將其中的Listen 80改成一個(gè)不用的端口,比如Listen 81。重新運(yùn)行安裝程序,這次應(yīng)該不會(huì)再有問(wèn)題了。


第二步,修改apache的配置文件
接著打開(kāi)Apache HTTP Server 的 httpd.conf(在 /conf/ 目錄下),先找到以下兩行:
#LoadModule dav_module modules/mod_dav.so
#LoadModule dav_fs_module modules/mod_dav_fs.so
把這兩行最前面的 '#' 字符刪除,然后把下面這行加到這些 LoadModule 指令的后面:
LoadModule dav_svn_module modules/mod_dav_svn.so
LoadModule authz_svn_module modules/mod_authz_svn.so
用記事本打開(kāi) Apache HTTP Server 的 httpd.conf,在文件最后面加上以下幾行:
<Location /svn>
??? DAV svn
??? SVNParentPath d:/svn
</Location>
其中d:/svn為你要建的倉(cāng)庫(kù)的父目錄(必須為本地目錄),最好用雙引號(hào)引一下.

第三步,創(chuàng)建倉(cāng)庫(kù)
根據(jù)apache的配置文件的設(shè)置建立目錄:d:/svn.然后我們就可以在下面建立倉(cāng)庫(kù)了,創(chuàng)建方法如下:
c:\>svnadmin create d:/svn/repository(svn大寫(xiě)的時(shí)候居然驗(yàn)證訪問(wèn)被拒絕)
命令執(zhí)行成功之后,會(huì)在d:/svn/repository下面生成很多的文件和目錄

第四步,使用
重新啟動(dòng)Apache Server
在瀏覽器中輸入網(wǎng)址:
http://localhost/svn/repository/
這時(shí)候,看到頁(yè)面顯示:

Revision 0: /
Powered by Subversion version 1.3.2 (r19776).





安裝成功,接下來(lái)將進(jìn)行進(jìn)一步的設(shè)置。

二、配置

1.? 以兩種方式運(yùn)行

(1) 以apache方式運(yùn)行
? svn使用apache的權(quán)限管理對(duì)檔案庫(kù)及目錄進(jìn)行讀寫(xiě)管理。
??htpasswd的調(diào)用:
??? 1)用cmd進(jìn)入到Apache的bin目錄下,直接開(kāi)始調(diào)用
??? 2)把htpasswd添加到系統(tǒng)變量里.
??
? 建立保存用戶名和密碼的文件
? htpasswd -c? svn-auth-filename? username1
? 然后,會(huì)提示輸入密碼,這里就加入了一個(gè)用戶了。然后再加一個(gè)用戶:
? htpasswd -m ?/svn-auth-filename username2
?
? 建立控制用戶訪問(wèn)權(quán)限的文件svn-access-filename
?[svn1:/]?????????????? //這表示,倉(cāng)庫(kù)svn1的根目錄下的訪問(wèn)權(quán)限
?harry = rw???????????? // svn1倉(cāng)庫(kù)harry用戶具有讀和寫(xiě)權(quán)限
?sally = r?????????????? // svn1倉(cāng)庫(kù)sally用戶具有讀權(quán)限
?[svn2:/]?????????????? //svn2倉(cāng)庫(kù)根目錄下的訪問(wèn)權(quán)限
?harry = r?????????????? // harry用戶在svn2倉(cāng)庫(kù)根目錄下只有讀權(quán)限
?sally =?????????????? // sally用戶在 svn2倉(cāng)庫(kù)根目錄下無(wú)任何權(quán)限
?[svn2:/src]?????????? //svn2倉(cāng)庫(kù)下src目錄的訪問(wèn)權(quán)限
?harry=rw????????????
?sally=r
?[/]????????????????? // 這個(gè)表示在所有倉(cāng)庫(kù)的根目錄下
?* = r?????????????? // 這個(gè)表示對(duì)所有的用戶都具有讀權(quán)限
?[groups]?????????????? // 這個(gè)表示群組設(shè)置
?svn1-developers = harry, sally?????????? // 這個(gè)表示某群組里的成員
?svn2-developers = sally
?[svn1:/]???????????
?@svn1-developers = rw?????? // 如果在前面加上@符號(hào),則表示這是個(gè)群組權(quán)限設(shè)置
?
然后修改httpd.conf配置:
<Location /svn>
DAV svn
SVNParentPath /svn
AuthType Basic
AuthName "Subversion repository"(注意引號(hào))
AuthUserFile? svn-auth-filename (保存用戶名和密碼)
Require valid-user
AuthzSVNAccessFile? svn-access-filename(保存用戶訪問(wèn)的權(quán)限策略)
</Location>
(注:)
svn-access-filename,svn-auth-filename 文件直接可以放到C:\Program Files\Apache Group\Apache2\下,這也是默認(rèn)的目錄,置于其他目錄下,啟動(dòng)apache server出現(xiàn)錯(cuò)錯(cuò)誤。
AuthUserFile文件需要用htpasswd工具創(chuàng)建、維護(hù);AuthzSVNAccessFile 文件可以用Subversion創(chuàng)建倉(cāng)庫(kù)以后,生成的conf文件夾下面的authz文件加以修改。
如果已經(jīng)有一個(gè)apache服務(wù),希望兩個(gè)apache服務(wù)同時(shí)運(yùn)行,則修改其中一個(gè)的服務(wù)端口。
修改httpd.conf中的一行: Listen 80 將80改成其他不用的端口號(hào)

啟動(dòng)apahce就可以通過(guò)
http://svnmachine-ip/svn/svn1
http://svnmachine-ip/svn/svn2
這兩個(gè)URL來(lái)訪問(wèn)倉(cāng)庫(kù)了,當(dāng)然,要受權(quán)限的限制,必須是合法用戶才能訪問(wèn)且具有相應(yīng)的權(quán)限

(2) svnserve方式運(yùn)行
這種方式的運(yùn)行又可以分為以下兩種(這和vsftp有些相似)
1) standalone mode
直接運(yùn)行 #svnserve –d
運(yùn)行 lsof -i :3690可以看到SVN服務(wù)器已經(jīng)在運(yùn)行

2) xinetd mode
在/etc/xinetd.d/下生成svnserve文件,內(nèi)容如下
service svnserve
{
disable = no
socket_type = stream
protocol = tcp
wait = no
user = svnpub? (最好建一個(gè)這樣的用戶管理svn)
server = /usr/local/bin/svnserve
server_args = -i
}
編輯 /etc/services 檔,加入底下兩行:
svnserve 3690/tcp # Subversion svnserve
svnserve 3690/udp # Subversion svnserve
重啟xinetd服務(wù),運(yùn)行 netstat -a|grep svnserve 可以看到SVN服務(wù)器已經(jīng)在運(yùn)行

默認(rèn)下客戶可以以匿名方式通過(guò)svn://方式任意訪問(wèn)檔案庫(kù),為了限制其權(quán)限,比如只允許讀操作,可以通過(guò)修改檔案庫(kù)conf子目錄中的svnseve.conf文件來(lái)實(shí)現(xiàn)。
#vi /svn1/conf/svnseve.conf
將下面三行前的#去掉
anon-access = none??????????? //則匿名用戶不可以通過(guò)svn://方式訪問(wèn)檔案庫(kù)
auth-access = write????
password-db = passwd????????? //使用passwd中的用戶名和密碼進(jìn)行認(rèn)證,有一點(diǎn)不好的是這里面的密碼輸?shù)氖敲魑?br />authz-db = authz????????????? //使用authz中的權(quán)限控制策略,寫(xiě)法如同apache中的svn-access-filename

如果想更強(qiáng)的安全性可以使用svn+ssh://訪問(wèn)機(jī)制。
首當(dāng)用戶通過(guò)svn+ssh://訪問(wèn)時(shí),服務(wù)器會(huì)自動(dòng)啟動(dòng)ssh認(rèn)證機(jī)制,要求用戶輸入密碼,對(duì)于window用戶來(lái)說(shuō)還需要安裝第三方軟件openssh,才可以采用這種機(jī)制。

2.? 將代碼導(dǎo)入項(xiàng)目倉(cāng)庫(kù)。在要導(dǎo)入倉(cāng)庫(kù)的目錄上面點(diǎn)擊右鍵,點(diǎn)擊TortoiseSVN項(xiàng)的子菜單Import…在URl里面填寫(xiě)http://服務(wù)器IP/svn/project,這里project就是剛剛建立的項(xiàng)目倉(cāng)庫(kù),

在下面填入注釋,點(diǎn)擊OK,彈出提示輸入用戶名密碼對(duì)話框,填入flmn和password,就可以把代碼導(dǎo)入倉(cāng)庫(kù)了。剛剛導(dǎo)入的文件并沒(méi)有顯示被svn管理,現(xiàn)在把這個(gè)目錄里文件都刪除,再在右鍵菜單里選擇SVN Checkout…就可以導(dǎo)出代碼,再看這個(gè)目錄,就有個(gè)小圖標(biāo)在文件夾圖標(biāo)下面了。

3.? 對(duì)于其它操作,和CVS差不多,這里就不贅述了。可以參考TortoiseSVN幫助文件。




放水老倌 2006-08-28 10:20 發(fā)表評(píng)論
]]>
[轉(zhuǎn)][譯]安裝基于Apache的Subversion服務(wù)器http://www.tkk7.com/zqli/archive/2006/08/26/65893.html放水老倌放水老倌Sat, 26 Aug 2006 01:36:00 GMThttp://www.tkk7.com/zqli/archive/2006/08/26/65893.htmlhttp://www.tkk7.com/zqli/comments/65893.htmlhttp://www.tkk7.com/zqli/archive/2006/08/26/65893.html#Feedback0http://www.tkk7.com/zqli/comments/commentRss/65893.htmlhttp://www.tkk7.com/zqli/services/trackbacks/65893.html [譯]安裝基于Apache的Subversion服務(wù)器

翻譯整理: PCplayer

時(shí)間:2006-08-06
版本:v0.1
關(guān)鍵詞:subversion 安裝 服務(wù)器 配置 apache
轉(zhuǎn)載請(qǐng)注意原文出處、版本、作者(譯者)
http://www.iusesvn.com/bbs/thread-158-1-1.html
--------------------------------------------------------------------------------

1. 引言
2. 安裝過(guò)程
2.1. 安裝Apache
2.2. 安裝Subversion
2.3. 配置


摘要

本文是TortoiseSVN1.3.5幫助中關(guān)于配置服務(wù)器一節(jié)的翻譯,根據(jù)行文需要做了一些調(diào)整與增減。英文原文參見(jiàn)TortoiseSVN1.3.5幫助的3.1. Apache Based Server。

要使用TortoiseSVN(或者其它的Subversion客戶端),你要有一個(gè)存放版本庫(kù)的地方。你可以將版本庫(kù)存放在本機(jī),使用file://協(xié)議來(lái)訪問(wèn),也可以將它們放在一個(gè)服務(wù)器上,使用http://或svn://協(xié)議來(lái)訪問(wèn)。兩種服務(wù)器協(xié)議(http://和svn://)也可以被加密成https://及svn+ssh://。下面將一步一步地為你展示如何在windows上配置這樣一個(gè)服務(wù)器。

如果你沒(méi)有服務(wù)器或者你只想單獨(dú)地工作,那么將版本庫(kù)存放在本機(jī)并使用file://協(xié)議來(lái)訪問(wèn)是你最好的選擇,這樣的話,你可以略過(guò)本文。

1. 引言
在所有的Subversion服務(wù)器配置方式中,基于Apache的是最靈活的。雖然配置起來(lái)有一點(diǎn)點(diǎn)復(fù)雜,但是它提供了其它方式所沒(méi)有的好處:

WebDAV
基于Apache配置的Subversion服務(wù)器使用了被許多其它程序支持的WebDAV協(xié)議。舉個(gè)例子,你可以在Windows的資源管理器中將這樣的一個(gè)版本庫(kù)掛載成一個(gè)“Webfolder”,然后像文件系統(tǒng)中的其它文件夾一樣訪問(wèn)它。

瀏覽版本庫(kù)
你可以在不安裝Subversion客戶端的情況下,使用瀏覽器來(lái)瀏覽版本庫(kù)中的內(nèi)容。這將使得更大范圍的用戶可以訪問(wèn)你的數(shù)據(jù)。

用戶驗(yàn)證
你可以使用任何Apache支持的驗(yàn)證機(jī)制,包括SSPI和LDAP。

安全
Apache是非常的穩(wěn)定和安全,因此你的版本庫(kù)自然而然地?fù)碛型瑯拥陌踩浴0⊿SL加密。

2. 安裝過(guò)程
2.1. 安裝Apache
安裝Apache前,你要有一臺(tái)運(yùn)行Windows2000、Windows XP + sp1或Windows2003的電腦。

警告:請(qǐng)注意,沒(méi)安裝Service Pack 1的Windows XP將導(dǎo)致錯(cuò)誤的網(wǎng)絡(luò)數(shù)據(jù)從而破壞你的版本庫(kù)!

http://httpd.apache.org/download.cgi 下載最新版本的Apache Web服務(wù)器。確保你下載的版本大于2.0.54。2.0.54版本的Apache將不能與Subversion 1.3.xx配合工作。而且,小于2.0.54的Apache也因?yàn)樵趙indows上的編譯存在一個(gè)bug而導(dǎo)致不能與subversion1.2配合使用。

一旦你已經(jīng)有了Apache2的安裝程序,你可以雙擊它,它將引導(dǎo)你完成整個(gè)安裝過(guò)程。請(qǐng)確保你輸入正確的服務(wù)器URL(如果你的服務(wù)器沒(méi)有DNS名稱,你可以直接輸入IP地址)。我建議你將Apache安裝成 for all Users,on Port 80,as a service。注意:如果你已經(jīng)有一個(gè)IIS或者其它的程序使用80端口,安裝可能會(huì)失敗。如果是這樣,你可以到程序目錄下的Apache Group\Apache2\conf目錄中找到文件httpd.conf,將其中的Listen 80改成一個(gè)不用的端口,比如Listen 81。然后重新運(yùn)行這個(gè)安裝程序,這次應(yīng)該不會(huì)再有問(wèn)題了。

現(xiàn)在你可以在你的瀏覽器中鍵入 http://loccalhost,如果呈現(xiàn)了一個(gè)已經(jīng)配置好的網(wǎng)站,那么你的Apache就安裝成功了。

警告

如果你將Apache安裝成一個(gè)服務(wù),它將以本地system帳戶來(lái)運(yùn)行。為Apache創(chuàng)建一個(gè)單獨(dú)的用戶來(lái)運(yùn)行它將會(huì)更安全一些。

請(qǐng)確保運(yùn)行Apache的用戶有版本庫(kù)的完全訪問(wèn)權(quán)限(右鍵版本庫(kù)目錄->屬性->安全)。要不然,用戶將無(wú)法提交他們的更改。

就算Apache以本機(jī)system來(lái)運(yùn)行,你也要設(shè)置它能完全讀寫(xiě)版本庫(kù)目錄。

如果沒(méi)有為Apache配置這個(gè)許可,用戶將會(huì)得到"禁止訪問(wèn)"的錯(cuò)誤信息,在Apache的錯(cuò)誤日志中表現(xiàn)為錯(cuò)誤500。

2.2. 安裝Subversion
http://subversion.tigris.org/ser ... entList?folderID=91 (英文)

http://www.iusesvn.com/bbs/forumdisplay.php?fid=7(中文)下載最新版本的Subversion。

運(yùn)行Subversion安裝程序,如果安裝程序能夠識(shí)別你已經(jīng)安裝了Apache,那么你的安裝基本上就OK了。如果它不能,那么你要做一些額外的步驟。

使用資源管理器,進(jìn)入Sibversion的安裝目錄(通常為c:\program files\Subversion),找到文件httpd/mod_dav_svn.so和mod_authz_svn.so,將它們拷貝到Apache的modules目錄(通常為c:\program files\apache group\apache2\modules)。

從Subversion的安裝目錄拷貝文件libdb43.dll到Apache的modules目錄。

使用如記事本之類的文本編輯器編輯Apache的配置文件(通常為c:\program files\apache group\apache2\conf\httd.conf),修改以下內(nèi)容:

去掉以下行的注釋(將開(kāi)頭的#刪除):

#LoadModule dav_fs_module modules/mod_dav_fs.so
#LoadModule dav_module modules/mod_dav.so
在LoadModule節(jié)的最后添加以下兩行:

LoadModule dav_svn_module modules/mod_dav_svn.so
LoadModule authz_svn_module modules/mod_authz_svn.so
2.3. 配置
現(xiàn)在,你已經(jīng)安裝了Apache和Subversion,但是Apache還不知道如果處理像TortoiseSVN一樣的Subversion客戶端。要讓Apache知道哪個(gè)URL將被Subversion使用,你要像下面這樣編輯Apache的配置文件(通常在c:\program files\apache group\apache2\conf\httpd.conf):

在配置文件的最后添加下面這些行:

<Location /svn>
SVNParentPath D:\SVN
AuthType Basic
AuthName "Subversion repositories"
AuthUserFile D:\passwd
#AuthzSVNAccessFile D:\svnaccessfile
Require valid-user
</Location>
這樣配置表示:你所有的版本庫(kù)將位于D:\SVN目錄下,要訪問(wèn)你的版本庫(kù)可以使用這樣的URL:http://MyServer/svn/,訪問(wèn)權(quán)限將由passwd文件中的用戶名/密碼來(lái)限制。

要?jiǎng)?chuàng)建passwd文件,可以打開(kāi)命令行(DOS窗口),將當(dāng)前目錄切換到apache2目錄(通常為c:\program files\apache group\apache2),然后打入以下命令以創(chuàng)建文件:

bin\htpasswd -c passwd <username>
重啟Apache服務(wù)。

將你的瀏覽器指向http://MyServer/svn/MyNewRepository(MyNewRepository是你之前創(chuàng)建的Subversion版本庫(kù))。如果一切正常,你將被提示輸入用戶名密碼,輸入正確的用戶名密碼后你就可以看到版本庫(kù)中的內(nèi)容了。

對(duì)你剛剛輸入的apache配置作一些簡(jiǎn)短的說(shuō)明:

<Location /svn>

意味著可以通過(guò)像這樣的URL(http://MyServer/svn)來(lái)訪問(wèn)Subversion版本庫(kù)

DAV svn

告訴Apache哪個(gè)模塊負(fù)責(zé)服務(wù)像那樣的URL--在這里就是Subversion模塊

SVNListParentPath on

在Subversion 1.3及更高版本中,這個(gè)指示器使得Subversion列出由SVNParentPath指定的目錄下所有的版本庫(kù)

SVNParentPath D:\SVN

告訴Subversion在目錄D:\SVN下尋找版本庫(kù)

AuthType Basic

啟用基本的驗(yàn)證,比如用戶名/密碼對(duì)

AuthName "Subversion repositories"

當(dāng)一個(gè)驗(yàn)證對(duì)話框彈出時(shí),告訴用戶這個(gè)驗(yàn)證是用來(lái)做什么的

AuthUserFile D:\passwd

指定D:\passwd用為密碼文件用來(lái)驗(yàn)證用戶的用戶名及密碼

AuthzSVNAccessFile D:\svnaccessfile

指定D:\svnaccessfile來(lái)限定各個(gè)用戶或組在版本庫(kù)中目錄的訪問(wèn)權(quán)限

Require valid-user

限定用戶只有輸入正確的用戶名及密碼后才能訪問(wèn)這個(gè)路徑

----------------------------------------

上面的配置僅僅是一個(gè)簡(jiǎn)單的示例。你還可以對(duì)Apache進(jìn)行許許多多的配置。

1如果你想讓所有用戶對(duì)版本庫(kù)都有讀的權(quán)限而只有特定的用戶才有寫(xiě)的權(quán)限,你可以將這行

Require valid-user
改為

<LimitExcept GET PROPFIND OPTIONS REPORT>
Require valid-user
</LimitExcept>
2上面的配置使用了passwd文件將你所有的版本庫(kù)作為一個(gè)單元來(lái)限定訪問(wèn)權(quán)限。如果你想獲得更多的控制,如限定某個(gè)用戶可以訪問(wèn)版本庫(kù)中的哪個(gè)目錄,可以把下面這行的#去掉:

#AuthzSVNAccessFile D:\svnaccessfile
然后創(chuàng)建一個(gè)Subversion授權(quán)文件。Apache將確保只有有效的用戶可以訪問(wèn)你的/svn位置,然后將用戶名傳到AuthzSVNAccessFile模塊,這樣可以依據(jù)Subversion授權(quán)文件得到更精細(xì)的權(quán)限控制。注意,路徑將被指定為[庫(kù):路徑]或者簡(jiǎn)單的[路徑]。如果你不明確指定一個(gè)庫(kù),訪問(wèn)規(guī)則將應(yīng)用到由SVNParentPath指定的目錄下所有的版本庫(kù)中。一個(gè)例子可能像這樣:

[groups]
admin = john, kate
devteam1 = john, rachel, sally
devteam2 = kate, peter, mark
docs = bob, jane, mike
training = zak

# 為所有庫(kù)指定默認(rèn)訪問(wèn)規(guī)則
# 所有人可以讀,管理員可以寫(xiě),危險(xiǎn)分子沒(méi)有任何權(quán)限
[/]
* = r
@admin = rw
dangerman =

# 允許開(kāi)發(fā)人員可以完全訪問(wèn)他們的項(xiàng)目版本庫(kù)
[proj1:/]
@devteam1 = rw
[proj2:/]
@devteam2 = rw
[bigproj:/]
@devteam1 = rw
@devteam2 = rw
trevor = rw

# 文檔編寫(xiě)人員對(duì)所有的docs目錄有寫(xiě)權(quán)限
[/trunk/doc]
@docs = rw

# 培訓(xùn)人員可以完全訪問(wèn)培訓(xùn)版本庫(kù)
[TrainingRepos:/]
@training = rw
以上介紹的配置為Apache多庫(kù)方式,即一個(gè)location可以同時(shí)為多個(gè)版本庫(kù)服務(wù),
假設(shè)你的ip為192.168.0.1,在D:\SVN目錄下建了兩個(gè)版本庫(kù),proj1和proj2
可以分別用下面兩個(gè)url來(lái)訪問(wèn)你的版本庫(kù)

http://192.168.0.1/svn/proj1


http://192.168.0.1/svn/proj1
還有一種配置方式為Apache單庫(kù)方式,即一個(gè)location只能為一個(gè)版本庫(kù)服務(wù),
配置時(shí)只要將上面的SVNParentPath改為SVNPath,同時(shí)將后面的路徑由版本庫(kù)的父目錄改為版本庫(kù)的目錄
如:

<Location /svn>
SVNPath D:\SVN\proj1
AuthType Basic
AuthName "Subversion repositories"
AuthUserFile D:\passwd
#AuthzSVNAccessFile D:\svnaccessfile
Require valid-user
</Location>
這時(shí),可以用下面的URL來(lái)訪問(wèn)版本庫(kù)proj1

http://192.168.0.1/svn


放水老倌 2006-08-26 09:36 發(fā)表評(píng)論
]]>
[轉(zhuǎn)]Subversion 的一些第三方工具 http://www.tkk7.com/zqli/archive/2006/08/24/65575.html放水老倌放水老倌Thu, 24 Aug 2006 09:09:00 GMThttp://www.tkk7.com/zqli/archive/2006/08/24/65575.htmlhttp://www.tkk7.com/zqli/comments/65575.htmlhttp://www.tkk7.com/zqli/archive/2006/08/24/65575.html#Feedback0http://www.tkk7.com/zqli/comments/commentRss/65575.htmlhttp://www.tkk7.com/zqli/services/trackbacks/65575.html 作者:未知 時(shí)間:2005-09-13 23:54 出處:Blog.ChinaUnix.net 責(zé)編:chinaitpower ??????????????摘要:Subversion 的一些第三方工具
? Subversion 的模塊化設(shè)計(jì)(在"分層化設(shè)計(jì)"一節(jié)中有描述)以及與其他語(yǔ)言的綁定的能力(在"使用 C 和 C++ 之外的語(yǔ)言"一節(jié)中有介紹)使得它很適合作為其他軟件的擴(kuò)展或是支持模塊。在這個(gè)附錄中,我們將簡(jiǎn)單的介紹一些使用 Subversion 的第三方的軟件。
??? 如果你想獲得這部分信息的最新的版本,請(qǐng)查閱 Subversion 站點(diǎn)的鏈接頁(yè)(http://subversion.tigris.org/project_links.html)。

D.1 客戶端和插件

??? AnkhSVN (http://ankhsvn.tigris.org/
??????? 微軟 Visual Studio .NET 的 Subversion 插件

??? JSVN (http://jsvn.alternatecomputing.com/
??????? Java Subversion 客戶端,包含一個(gè) IDEA 的插件

??? psvn.el (http://xsteve.nit.at/prg/vc_svn/
??????? Emacs 的 Subversion 接口

??? RapidSVN (http://rapidsvn.tigris.org/
??????? 基于 WxPython libraries 的跨平臺(tái)的 Subversion 圖形化客戶端

??? Subclipse (http://subclipse.tigris.org/
??????? Eclipse 下的 Subversion 插件

??? Subway (http://nidaros.homedns.org/subway/
??????? Microsoft SCC provider for Subversion

??? sourcecross.org (http://www.sourcecross.org/
??????? Microsoft SCC provider for Subversion

??? Supervision (http://supervision.tigris.org/
??????? Subversion 的 Java/Swing 圖形化客戶端

??? Sven (http://www.nikwest.de/Software/#SvenOverview
??????? 使用 Mac OS X Cocoa 框架開(kāi)發(fā)的 Subversion 圖形化客戶端

??? Svn4Eclipse (http://svn4eclipse.tigris.org/
??????? 為 Eclipse IDE 設(shè)計(jì)的 Subversion 插件

??? Svn-Up (http://svnup.tigris.org/
??????? 基于 Java 的 Subversion 以及 IDEA IDE 的插件
???
??? TortoiseSVN (http://tortoisesvn.tigris.org/
??????? 作為微軟 Windows 外殼擴(kuò)展設(shè)計(jì)的 Subversion 客戶端
???
??? WorkBench (http://pysvn.tigris.org/
??????? 在 Subversion 基礎(chǔ)上構(gòu)建的基于 Python 的跨平臺(tái)軟件設(shè)計(jì)環(huán)境

D.2 和語(yǔ)言的綁定

??? PySVN (http://pysvn.tigris.org/
??????? 供 Python 使用的面對(duì)對(duì)象的 Subversion 客戶端 API 項(xiàng)目

??? Subversion (http://subversion.tigris.org/
??????? 供 Python、Perl、和 Java 使用的 Subversion API;對(duì)應(yīng)于核心的 C API

??? SVNCPP (http://rapidsvn.tigris.org/
??????? 供 C++ 的面對(duì)對(duì)象的 Subversion 客戶端 API

D.3 倉(cāng)庫(kù)轉(zhuǎn)換工具

??? cvs2svn (http://cvs2svn.tigris.org/
??????? 從 CVS 到 Subversion 的轉(zhuǎn)換

??? vss2svn (http://vss2svn.tigris.org/
??????? 從 Microsoft SourceSafe 到 Subversion 的轉(zhuǎn)換
??
??? Subversion VCP Plugin (http://svn.clkao.org/revml/branches/svn-perl/
??????? 從 CVS 到 Subversion 轉(zhuǎn)換的 VCP 插件

D.4 更高領(lǐng)域的一些工具

??? Kwiki (http://www.kwiki.org/
??????? 帶有 Subversion 備份支持的 Wiki

??? Scmbug (http://freshmeat.net/projects/scmbug/
??????? 集成了漏洞跟蹤的軟件配置管理系統(tǒng),支持 Subversion

??? Subissue (http://subissue.tigris.org/
??????? 直接在 Subversion 倉(cāng)庫(kù)中跟蹤發(fā)布

??? Subwiki (http://subwiki.tigris.org/
??????? 使用 Subversion 作為數(shù)據(jù)倉(cāng)庫(kù) 的 Wiki

??? svk (http://svk.elixus.org/
??????? 基于 Subversion 的分散式的 版本控制系統(tǒng)

??? submaster (http://www.rocklinux.org/submaster.html
??????? 基于 Subversion 的分布式的軟件開(kāi)發(fā)系統(tǒng)

D.5 倉(cāng)庫(kù)瀏覽工具

??? SVN::Web (http://svn.elixus.org/repos/member/clkao/
??????? 基于 Perl 的 Subversion 倉(cāng)庫(kù) Web 接口

??? ViewCVS (http://viewcvs.sourceforge.net/
??????? 基于 Python 的 CGI 腳本,用來(lái)瀏覽 CVS 和 Subversion 倉(cāng)庫(kù)

??? WebSVN (http://websvn.tigris.org/
??????? 基于 PHP 的 Subversion 第三方倉(cāng)庫(kù)瀏覽工具

??? Trac (http://projects.edgewall.com/trac
??????? 基于 Web 的軟件項(xiàng)目管理、漏洞跟蹤、發(fā)布系統(tǒng),使用版本控制系統(tǒng)接口,并且集成了 Wiki 支持

(筆記:http://www.iusesvn.com/



放水老倌 2006-08-24 17:09 發(fā)表評(píng)論
]]>
主站蜘蛛池模板: 国产精品亚洲w码日韩中文| 国产99久久亚洲综合精品| 精品国产日韩亚洲一区| 久久精品网站免费观看| 桃子视频在线观看高清免费视频| 国产91成人精品亚洲精品| 亚洲依依成人亚洲社区| 久久亚洲精品无码VA大香大香| 久久精品国产亚洲一区二区三区| 好爽又高潮了毛片免费下载| 曰批全过程免费视频播放网站| 99久久婷婷免费国产综合精品| 免费看又黄又爽又猛的视频软件 | 国产99久久久久久免费看| 亚洲色偷偷综合亚洲av78 | 无码AV片在线观看免费| AAAAA级少妇高潮大片免费看| 久久精品国产亚洲AV| 亚洲成av人片天堂网无码】| 亚洲欧洲日韩国产一区二区三区| 亚洲视频欧洲视频| 精品亚洲aⅴ在线观看| 亚洲AV日韩AV永久无码下载| 亚洲精品无码久久久影院相关影片| 亚洲日韩中文字幕日韩在线| 人人狠狠综合久久亚洲高清| 国产精品公开免费视频| 免费视频中文字幕| 高清国语自产拍免费视频国产| 好先生在线观看免费播放| 无码日韩精品一区二区免费| 成人免费视频77777| 国产无人区码卡二卡三卡免费| 99国产精品永久免费视频| 亚洲成人免费在线观看| 波多野结衣在线免费视频| 午夜性色一区二区三区免费不卡视频 | 一区二区免费国产在线观看| 免费的黄色网页在线免费观看| 免费夜色污私人影院网站电影 | 久久影院亚洲一区|