<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                ### 屬性 我們已經詳細講述了Subversion存儲和檢索版本庫中不同版本的文件和目錄的細節,并且用了好幾個章節來論述這個工具的基本功能。到此為止,Subversion還僅僅表現出一個普通的版本控制理念。但是Subversion并沒有就此止步。 作為目錄和文件版本化的補充,Subversion提供了對每一個版本化的目錄和文件添加、修改和刪除版本化的元數據的接口,我們用*屬性*來表示這些元數據。我們可以認為它們是一個兩列的表,附加到你的工作拷貝的每個條目上,映射屬性名到任意的值。一般來說,屬性的名稱和值可以是你希望的任何值,限制就是名稱必須是可讀的文本,并且最好的一點是這些屬性也是版本化的,就像你的文本內容文件,你可以像提交文本修改一樣修改、提交和恢復屬性修改,當你更新時也會接收到別人的屬性修改。 **Subversion的其他屬性** Subversion的屬性也可以在別的地方出現,就像文件和目錄可能附加有任意的屬性名和值,每個修訂版本作為一個整體也可以附加任意的屬性,也有同樣的限制―可讀的文本名稱和任何你希望的,二進制值―除了修訂版本不是版本化的,參見[“未受版本控制的屬性”一節]( "未受版本控制的屬性")獲得版本化的屬性信息。 在本小節,我們將會檢驗這個工具―不僅是對Subversion的用戶,也對Subversion本身―對于屬性的支持。你會學到與屬性相關的**svn**子命令,和屬性怎樣影響你的普通Subversion工作流,希望你會感到Subversion的屬性可以提高你的版本控制體驗。 ### 為什么需要屬性? 屬性可能會是工作拷貝的有益補充,實際上,Subversion本身使用屬性來存放特殊的信息,作為支持特別操作的一種方法,同樣,你也可以使用屬性來實現自己的目的,當然,你對屬性作的任何事情也可以針對普通的版本化文件,但是先考慮下面Subversion使用屬性的例子。 假定你希望設計一個網站存放許多數碼圖片,并且顯示他們的標題和時間戳,現在你的圖片集經常修改,所以你希望你的網站能夠盡量的自動化,這些圖片可能非常大,所以根據這個網站的特性,你希望在網站給用戶提供圖標圖像。你可以用傳統的文件做這件事,你可以有一個`image123.jpg`和一個`image123-thumbnail.jpg`對應在同一個目錄,有時候你希望保持文件名相同,你可以使用不同的目錄,如`thumbnails/image123.jpg`。你可以用一種相似的樣式來保存你的標題和時間戳同原始圖像文件分開。很快你的目錄樹會是一團糟,每個新圖片的添加都會成倍的增加混亂。 現在考慮使用Subversion文件的屬性來做相同的設置,想象我們有一個單獨的圖像文件`image123.jpg`,然后這個文件的屬性集包括`caption`、`datestamp`甚至`thumbnail`。現在你的工作拷貝目錄看起來更容易管理―實際上,它看起來只有圖像文件,但是你的自動化腳本知道得更多,它們知道可以用**svn**(更好的選擇是使用Subversion的語言綁定―見[“使用C和C++以外的語言”一節]( "使用C和C++以外的語言"))來挖掘更多的站點顯示需要的額外信息,而不必去閱讀一個索引文件或者是玩一個路徑處理的游戲。 你怎樣(而且如果)使用Subversion完全在你,像我們提到的,Subversion擁有它自己的屬性集,我們會在后面的章節討論,但首先,讓我們討論怎樣使用**svn**的屬性處理選項。 ### 處理屬性 **svn**命令提供一些方法來添加和修改文件或目錄的屬性,對于短的,可讀的屬性,最簡單的添加方法是在**propset**子命令里指定正確的名稱和值。 ~~~ $ svn propset copyright '(c) 2003 Red-Bean Software' calc/button.c property 'copyright' set on 'calc/button.c' $ ~~~ 但是我們已經“吹噓”過Subversion為屬性值提供的靈活性,如果你計劃有一個多行的可讀文本,甚至是二進制文件的屬性值,你通常不希望在命令行里指定,所以**propset**子命令使用`--file`(`-F`)選項來指定一個保存新屬性值的文件的名字。 ~~~ $ svn propset license -F /path/to/LICENSE calc/button.c property 'license' set on 'calc/button.c' $ ~~~ 作為**propset**命令的補充,**svn**提供了一個**propedit**命令,這個命令使用定制的編輯器程序(見[“config”一節]( "config"))來添加和修改屬性。當你運行這個命令,**svn**調用你的編輯器程序打開一個臨時文件,文件中保存當前的屬性值(或者是空文件,如果你正在添加新的屬性)。然后你只需要修改為你想要的值,保存臨時文件,然后離開編輯器程序。如果Subversion發現你已經修改了屬性值,就會接受新值,如果你未作任何修改而離開,不會產生屬性修改操作。 ~~~ $ svn propedit copyright calc/button.c ### exit the editor without changes No changes to property 'copyright' on 'calc/button.c' $ ~~~ 我們也應該注意導,像其它**svn**子命令一樣,這些關聯的屬性可以一次添加到多個路徑上,這樣就可以通過一個命令修改一組文件的屬性。舉個例子,我們可以: ~~~ $ svn propset copyright '(c) 2002 Red-Bean Software' calc/* property 'copyright' set on 'calc/Makefile' property 'copyright' set on 'calc/button.c' property 'copyright' set on 'calc/integer.c' … $ ~~~ 如果不能方便的得到存儲的屬性值,那么屬性的添加和編輯操作也不會很容易,所以**svn**提供了兩個子命令來顯示文件和目錄存儲的屬性名和值。**svn proplist**命令會列出路徑上存在的所有屬性名稱,一旦你知道了某個節點的屬性名稱,你可以用**svn propget**獲取它的值,這個命令獲取給定的路徑(或者是一組路徑)和屬性名稱,打印這個屬性的值到標準輸出。 ~~~ $ svn proplist calc/button.c Properties on 'calc/button.c': copyright license $ svn propget copyright calc/button.c (c) 2003 Red-Bean Software ~~~ 還有一個**proplist**變種命令會列出所有屬性的名稱和值,只需要設置`--verbose`(`-v`)選項。 ~~~ $ svn proplist --verbose calc/button.c Properties on 'calc/button.c': copyright : (c) 2003 Red-Bean Software license : ================================================================ Copyright (c) 2003 Red-Bean Software. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions, and the recipe for Fitz's famous red-beans-and-rice. … ~~~ 最后一個與屬性相關的子命令是**propdel**,因為Subversion允許屬性值為空,所有不能用**propedit**或者**propset**命令刪除一個屬性。舉個例子,這個命令*不會*產生預期的效果: ~~~ $ svn propset license '' calc/button.c property 'license' set on 'calc/button.c' $ svn proplist --verbose calc/button.c Properties on 'calc/button.c': copyright : (c) 2003 Red-Bean Software license : $ ~~~ 你需要用**propdel**來刪除屬性,語法與其它與屬性相關命令相似: ~~~ $ svn propdel license calc/button.c property 'license' deleted from ''. $ svn proplist --verbose calc/button.c Properties on 'calc/button.c': copyright : (c) 2003 Red-Bean Software $ ~~~ 現在你已經熟悉了所有與屬性相關的**svn**子命令,讓我們看看屬性修改如何影響Subversion的工作流。我們前面提到過,文件和目錄的屬性是版本化的,這一點類似于版本化的文件內容。后果之一,就是Subversion具有了同樣的機制來合并―用干凈或者沖突的方式―其他人的修改應用到你的修改。 **修改修訂版本的屬性** 還記的這些未版本化的屬性?你也可以使用**svn**命令修改這些屬性。只需要添加`--revprop`命令參數,并且說明希望修改屬性的修訂版本。因為修訂版本是全局的,你不需要指定一個路徑,只要你已經位于你希望修改屬性的工作拷貝路徑,舉個例子,你希望修改一個存在版本的提交日志信息。 ~~~ $ svn propset svn:log '* button.c: Fix a compiler warning.' -r11 --revprop property 'svn:log' set on repository revision '11' $ ~~~ 注意,修改這些未版本化的屬性的能力一定要明確的添加給版本庫管理員(見[“鉤子腳本”一節]( "鉤子腳本"))。因為屬性沒有版本化,如果編輯的時候不小心,就會冒丟失信息的風險,版本庫管理員可以設置方法來防范這種意外,缺省情況下,修改未版本化的屬性是禁止的。 就像文件內容,你的屬性修改是本地修改,只有使用**svn commit**命令提交后才會保存到版本庫中,屬性修改也可以很容易的取消―**svn revert**命令會恢復你的文件和目錄為編輯前狀態,包括內容、屬性和其它的信息。另外,你可以使用**svn status**和**svn diff**接受感興趣的文件和目錄屬性的狀態信息。 ~~~ $ svn status calc/button.c M calc/button.c $ svn diff calc/button.c Property changes on: calc/button.c ___________________________________________________________________ Name: copyright + (c) 2003 Red-Bean Software $ ~~~ 注意**status**子命令顯示的`M`在第二列而不是在第一列,這是因為我們修改了`calc/button.c`的屬性,而不是它的文本內容,如果我們都修改了,我們也會看到`M`出現在第一列(見[“**svn status**”一節]( "svn status"))。 **屬性沖突** 與文件內容一樣,本地的屬性修改也會同別人的提交沖突,如果你更新你的工作拷貝目錄并且接收到有資源屬性修改與你的修改沖突,Subversion會報告資源處于沖突狀態。 ~~~ % svn update calc M calc/Makefile.in C calc/button.c Updated to revision 143. $ ~~~ Subversion也會在沖突資源的同一個目錄創建一個`.prej`擴展名的文件,保存沖突的細節。你一定要檢查這個文件的內容來決定如何解決沖突,在你解決沖突之前,你會在使用**svn status**時看到這個資源的輸出的第二列是一個`C`,提交本地修改的嘗試會失敗。 ~~~ $ svn status calc C calc/button.c calc/button.c.prej $ cat calc/button.c.prej prop 'linecount': user set to '1256', but update set to '1301'. $ ~~~ 為了解決屬性沖突,只需要確定沖突的屬性保存了它們應該的值,然后使用**svn resolved**命令告訴Subversion你已經手工解決了問題。 你也許已經注意到了Subversion在顯示屬性時的非標準方式。你還可以運行**svn diff**并且重定向輸出來產生一個有用的補丁文件,**patch**程序會忽略屬性補丁―作為規則,它會忽略任何不理解的噪音。很遺憾,這意味著完全應用**svn diff**產生的補丁時,任何屬性修改必須手工實施。 就象你看到的,屬性修改的出現并沒有對典型的Subversion工作流有顯著的影響,更新工作拷貝、檢查文件和目錄的狀態、報告所作的修改和提交修改到版本庫等等的工作方式完全與屬性的存在與否無關。**svn**程序有一些額外的子命令用來進行屬性修改,但那是唯一顯而易見不對稱的命令。 ### 特別屬性 Subversion沒有關于屬性的特殊政策―你可以通過它們實現自己的目的。Subversion只是要求你不要使用`svn:`開頭的命名空間作為屬性名,這是Subversion自己使用的命名空間。實際上,Subversion定義了某些特殊的屬性,這些屬性對它們所附加的文件和目錄有特殊的影響。在本小節,我們會解開這個謎團,并且描述這些屬性怎樣讓你的生活更加容易。 #### `svn:executable` `svn:executable`屬性用來控制一個版本化的文件自動執行文件權限設定,這個屬性沒有特定的值―它只是說明一個Subversion可以保留的文件權限的期望值,刪除這個屬性會恢復操作系統對這些權限的完全控制。 在多數操作系統,執行一個文件或命令的能力是由執行位管理的,這些位通常是關閉的,必須由用戶顯式的指定,這意味著你必須改變文件的執行位,然后更新你的工作拷貝,燃火如果你的文件成為更新的一部分,它的執行位會被關閉,所以Subversion提供了`svn:executable`這個屬性來保持打開執行位。 這個屬性對于沒有可執行權限位的文件系統無效,如FAT32和NTFS。 [[28](#)] 也就是說,盡管它沒有定義的值,在設置這個屬性時,Subversion會強制它的值為`*`,最后,這個屬性只對文件有效,目錄無效。 #### `svn:mime-type` `svn:mime-type`屬性為Subversion的許多目的服務,除了保存一個文件的多用途網際郵件擴展(MIME)分類以外,這個屬性值也描述了一些Subversion自己使用的行為特性。 舉個例子,如果一個文件`svn:mime-type`屬性設置為非文本的MIME類型(通常是那些不是`text/`開頭的類型,但也有例外),Subversion會假定這個文件保存了二進制內容―也就是不可讀的―數據。一個好處就是Subversion通常在更新到工作拷貝時提供了一個前后相關的以行為基礎的修改合并,但是對于保存二進制數據的文件,沒有“行”的概念,所以對這些文件,Subversion不會在更新時嘗試執行合并操作,相反,任何時候你在本地修改的一個二進制文件有了更新,你的文件會被重命名為`.orig`為擴展名,然后Subversion保存一個新的工作拷貝文件,保存更新時得到的修改,但原來的文件名已經不是你自己的本地修改。這個行為模式是用來保護用戶在對不可文本合并的文件嘗試執行文本的合并時失敗的情形。 另外,如果`svn:mime-type`屬性被設置,Subversion的Apache模塊會使用這個值來在HTTP頭里輸入`Content-type:`,這給了web瀏覽器如何顯示一個文件提供了至關重要的線索。 #### `svn:ignore` 這個`svn:ignore`屬性保存了一個Subversion特定操作忽略的文件模式列表,或許這個是最常用的屬性,它可以與`global-ignores`運行配置選項配合使用(見[“config”一節])來過濾**svn status**、**svn add**和**svn import**命令中操作的未版本化文件。 `svn:ignore`背后的基本原理很容易解釋,Subversion不會假定工作拷貝中的所有文件或子目錄是版本控制的一部分,資源必須被顯式的使用**svn add**或者**svn import**放到Subversion的管理控制之下,作為結果,經常有許多工作拷貝的資源并沒有版本化。 現在,**svn status**命令會的顯示會包括所有未納入版本控制且沒有用`global-ignores`(或是內置的缺省值)過濾掉的文件和子目錄,這樣可以幫助用戶查看是否忘記了把某些自愿加入到版本控制。 但是Subversion不可能猜測到每個需要忽略的資源的名字,但是也有一些資源是*所有*特定版本庫的工作拷貝都有忽略的,強制版本庫的每個用戶來添加這些模式到他們的運行配置區域不僅僅是一個負擔,也會與用戶取出的其他工作拷貝配置需要存在潛在的沖突。 解決方案是保存的忽略模式必須對出現在給定目錄和這個目錄本身的資源是獨立的,一個常見的例子就是一個未版本化資源對一個目錄來說是唯一的,會出現在那個位置,包括程序編譯的輸出,或者是―用一個本書的例子―DocBook的文件生成的HTML、PDF或者是PostScript文件。 **CVS用戶的忽略模式** Subversion的`svn:ignore`屬性與CVS的`.cvsignore`文件的語法和功能非常類似,實際上,如果你移植一個CVS的工作拷貝到Subversion,你可以直接使用`.cvsignore`作為**svn propset**輸入文件參數: ~~~ $ svn propset svn:ignore -F .cvsignore . property 'svn:ignore' set on '.' $ ~~~ 但是CVS和Subversion處理忽略模式的方式有一些不同,這兩個系統在不同的時候使用忽略模式,忽略模式應用的對象也由微小的不同,但是Subversion不會識別重置回到沒有忽略模式的`!`模式的使用。 為了這個目的,`svn:ignore`屬性是解決方案,它的值是一個多行的文件模式集,一行一個模式,這個屬性已經設置到這個你希望應用模式的目錄。 舉個例子,你的**svn status**有如下的輸出: ~~~ $ svn status calc M calc/button.c calc/calculator calc/data.c calc/debug_log calc/debug_log.1 calc/debug_log.2.gz calc/debug_log.3.gz ~~~ 在這個例子里,你對`button.c`文件作了一些屬性修改,但是你的工作拷貝也有一些未版本化的文件:你從源代碼編譯的最新的`計算器`程序是`data.c`,一系列調試輸出日志文件,現在你知道你的編譯系統會編譯生成`計算器`程序。 就像你知道的,你的測試組件總是會留下這些調試日志,這對所有的工作拷貝都是一樣的,不僅僅使你的。你也知道你不會有興趣在**svn status**命令中顯示這些信息,所以使用**svn propedit svn:ignore calc**來為`calc`目錄增加一些忽略模式,舉個例子,你或許會添加如下的值作為`svn:ignore`屬性: ~~~ calculator debug_log* ~~~ 當你添加完這些屬性,你會在`calc`目錄有一個本地修改,但是注意你的**svn status**輸出有什么其他的不同: ~~~ $ svn status M calc M calc/button.c calc/data.c ~~~ 現在,所有多余的輸出不見了!當然,這些文件還在工作拷貝中,Subversion僅僅是不再提醒你它們的存在和未版本化。現在所有討厭的噪音都已經刪除了,你留下了更加感興趣的項目―如你忘記添加到版本控制的源代碼文件。 如果想查看被忽略的文件,可以設置Subversion的`--no-ignore`選項: ~~~ $ svn status --no-ignore M calc/button.c I calc/calculator calc/data.c I calc/debug_log I calc/debug_log.1 I calc/debug_log.2.gz I calc/debug_log.3.gz ~~~ **svn add**和**svn import**也會使用這個忽略模式列表,這兩個操作都包括了詢問Subversion來開始管理一組文件和目錄。比強制用戶挑揀目錄樹中那個文件要納入版本控制的方式更好,Subversion使用忽略模式來檢測那個文件不應該在大的迭代添加和導入操作中進入版本控制系統。 #### `svn:keywords` Subversion具備有添加*關鍵字*的能力―一些有用的,關于版本化的文件動態信息的片斷―不必直接添加到文件本身。關鍵字通常會用來描述文件最后一次修改的一些信息,因為這些信息每次都有改變,更重要的一點,這是在文件修改*之后*,除了版本控制系統,對于任何處理完全保持最新的數據都是一場爭論,作為人類作者,信息變得陳舊是不可避免的。 舉個例子,你有一個文檔希望顯示最后修改的日期,你需要麻煩每個作者提交之前做這件事情,同時會改變描述這部分細細的部分,但是遲早會有人忘記做這件事,不選擇簡單的告訴Subversion來執行替換`LastChangedDate`關鍵字的操作,在你的文檔需要放置這個關鍵字的地方放置一個*keyword anchor*,這個anchor只是一個格式為`$`*`KeywordName`*`$`字符串。 所有作為anchor出現在文件里的關鍵字是大小寫敏感的:為了關鍵字的擴展,你必須使用正確的按順序大寫。你必須考慮`svn:keywords`的屬性值也是大小寫敏感―特定的關鍵字名會忽略大小寫,但是這個特性已經被廢棄了。 Subversion定義了用來替換的關鍵字列表,這個列表保存了如下五個關鍵字,有一些也包括了可用的別名: `Date` 這個關鍵字保存了文件最后一次在版本庫修改的日期,看起來類似于`$Date: 2002-07-22 21:42:37 -0700 (Mon, 22 Jul 2002) $`,它也可以用`LastChangedDate`來指定。 `Revision` 這個關鍵字描述了這個文件最后一次修改的修訂版本,看起來像`$Revision: 144 $`,也可以通過`LastChangedRevision`或者`Rev`引用。 `Author` 這個關鍵字描述了最后一個修改這個文件的用戶,看起來類似`$Author: harry $`,也可以用`LastChangedBy`來指定。 `HeadURL` 這個關鍵字描述了這個文件在版本庫最新的版本的完全URL,看起來類似`$HeadURL: http://svn.collab.net/repos/trunk/README $`,可以縮寫為`URL`。 `Id` 這個關鍵字是其他關鍵字一個壓縮組合,它看起來就像`$Id: calc.c 148 2002-07-28 21:30:43Z sally $`,可以解釋為文件`calc.c`上一次修改的修訂版本號是148,時間是2002年7月28日,作者是`sally`。 只在你的文件增加關鍵字anchor不會做什么特別的事情,Subversion不會嘗試對你的文件內容執行文本替換,除非明確的被告知這樣做,畢竟,你可以撰寫一個文檔 關于如何使用關鍵字,你希望Subversion不會替代你漂亮的關于不需要替換的關鍵字anchor實例! 為了告訴Subversion是否替代某個文件的關鍵字,我們要再次求助于屬性相關的子命令,當`svn:keywords`屬性設置到一個版本化的文件,這些屬性控制了那些關鍵字將會替換到那個文件。這個值是空格分隔的前面列表的名稱或是別名列表。 舉個例子,假定你有一個版本化的文件`weather.txt`,內容如下: ~~~ Here is the latest report from the front lines. $LastChangedDate$ $Rev$ Cumulus clouds are appearing more frequently as summer approaches. ~~~ 當沒有`svn:keywords`屬性設置到這個文件,Subversion不會有任何特別操作,現在讓我們允許`LastChangedDate`關鍵字的替換。 ~~~ $ svn propset svn:keywords "Date Author" weather.txt property 'svn:keywords' set on 'weather.txt' $ ~~~ 現在你已經對`weather.txt`的屬性作了修改,你會看到文件的內容沒有改變(除非你之前做了一些屬性設置),注意這個文件包含了`Rev`的關鍵字anchor,但我們沒有在屬性值中包括這個關鍵字,Subversion會高興的忽略替換這個文件中的關鍵字,也不會替換`svn:keywords`屬性中沒有出現的關鍵字。 **關鍵字和虛假的差異** 用戶可見的關鍵字替換會讓你以為每一個具有此特性的文件的每個版本都會與前一個版本至少在關鍵字替換的地方不同,但是實際上并不是如此,當用**svn diff**檢查本地修改時,或者是在使用**svn commit**傳輸修改之前,Subversion不會“取消替換”任何上次替換的關鍵字,結果就是版本庫保存的文件只保存用戶實際做的修改。 在你提交了屬性修改后,Subversion會立刻更新你的工作文件為新的替代文本,你將無法找到`$LastChangedDate$`的關鍵字anchor,你會看到替換的結果,這個結果也保存了關鍵字的名字,與美元符號(`$`)綁定在一起,而且我們預測的,`Rev`關鍵字不會被替換,因為我們沒有要求這樣做。 注意我們設置`svn:keywords`屬性為"Date Author",關鍵字anchor使用別名`$LastChangedDate$`并且正確的擴展。 ~~~ Here is the latest report from the front lines. $LastChangedDate: 2002-07-22 21:42:37 -0700 (Mon, 22 Jul 2002) $ $Rev$ Cumulus clouds are appearing more frequently as summer approaches. ~~~ 如果有其他人提交了`weather.txt`的修改,你的此文件的拷貝還會顯示同樣的替換關鍵字值―直到你更新你的工作拷貝,此時你的`weather.txt`重的關鍵字將會被替換來反映最新的提交信息。 #### `svn:eol-style` 不像我們說過的版本化文件的`svn:mime-type`屬性,Subversion假定這個文件保存了可讀的數據,一般來講,Subversion因為這個屬性來判斷一個文件是否可以用上下文區別報告,否則,對Subversion來說只是字節。 這意味著缺省情況下,Subversion不會關注任何*行結束標記(end-of-line,EOL)*,不幸的是不同的操作系統在文本文件使用不同的行結束標志,舉個例子,Windows平臺下的A編輯工具使用一對SCII控制字符―回車(`CR`)和一個移行(`LF`)。Unix軟件,只使用一個`LF`來表示一個行的結束。 并不是所有操作系統的工具準備好了理解與*本地行結束樣式*不一樣的行結束格式,一個常見的結果是Unix程序會把Windows文件中的`CR`當作一個不同的字符(通常表現為`^M`),而Windows程序會把Unix文件合并為一個非常大的行,因為沒有發現標志行結束的回車加換行(或者是`CRLF`)字符。 對外來EOL標志的敏感會讓在各個操作系統分享文件的人們感到沮喪,例如,考慮有一個源代碼文件,開發者會在Windows和Unix系統上編輯這個文件,如果所有的用戶使用的工具可以展示文件的行結束,那就沒有問題。 但實踐中,許多常用的工具不會正確的讀取外來的EOL標志,或者是將文件的行結束轉化為本地的樣式,如果是前者,他需要一個外部的轉化工具(如**dos2unix**或是他的伴侶,**unix2dos**)來準備需要編輯的文件。后一種情況不需要額外的準備工作,兩種方法都會造成文件會與原來的文件在每一行上都不一樣!在提交之前,用戶有兩個選擇,或者選擇用一個轉化工具恢復文件的行結束樣式,或者是簡單的提交文件―包含新的EOL標志。 這個情景的結局看起來像是要浪費時間對提交的文件作不必要的修改,浪費時間是痛苦的,但是如果提交修改了文件的每一行,判斷那個文件是通過正常的方式修改的會是一件復雜的工作,bug在那一行修正的?那一行引入了語法錯誤? 這個問題的解決方案是`svn:eol-style`屬性,當這個屬性設置為一個正確的值,Subversion使用它來判斷針對行結束樣式執行何種特殊的操作,而不會因為多種操作系統的每次提交發生震蕩。正確的值有: `native` 這會導致保存EOL標志的文件使用Subversion運行的操作系統的本地編碼,換句話說,如果一個Windows用戶取出一個工作拷貝包含的一個文件有`svn:eol-style`的屬性設置為`native`,這個文件會使用`CRLF`的EOL標志,一個Unix用戶取出相同的文件會看到他的文件使用`LF`的EOL標志。 注意Subversion實際上使用`LF`的EOL標志,而不會考略操作系統,盡管這對用戶來說是透明的。 `CRLF` 這會導致這個文件使用`CRLF`序列作為EOL標志,不管使用何種操作系統。 `LF` 這會導致文件使用`LF`字符作為EOL標志,不管使用何種操作系統。 `CR` 這會導致文件使用`CR`字符作為EOL標志,不管使用何種操作系統。這種行結束樣式不是很常見,它用在一些老的蘋果機(Subversion不會運行的機器上)。 #### `svn:externals` `svn:externals`屬性保存了指導Subversion從一個或多個取出的工作拷貝移出目錄的指示,關于這個關鍵字的更多信息,見[“外部定義”一節]。 #### `svn:special` `svn:special`是唯一一個不是用戶直接設置和修改的`svn:`屬性,當“特別的”對象如一個對象鏈接計劃加入到版本庫,Subversion會自動設置這個屬性。版本庫像普通文件一樣保存`svn:special`對象,然而,當一個客戶端在檢出和更新操作時看到這個屬性時,就會翻譯這個文件的內容,并且將文件轉化為特殊類型的對象,在Subversion1.1中,只有版本化的符號鏈接有這個屬性附加,但在以后的版本中其它特殊的節點也有可能使用這個屬性。 注意:Windows客戶端不會有符號鏈接,因此會忽略含有`svn:special`聲明為符號鏈的文件,在Windows,用戶會以一個工作拷貝中的版本化的文件作為結束。 ### 自動屬性設置 屬性是Subversion一個強大的特性,成為本章和其它章討論的許多Subversion特性的關鍵組成部分―文本區別和合并支持、關鍵字替換、新行的自動轉換等等。但是為了從屬性得到完全的利益,他們必須設置到正確的文件和目錄。不幸的是,在日常工作中很容易忘記這一步工作,特別是當沒有設置屬性不會引起明顯的錯誤時(至少相對與未能添加一個文件到版本控制這種操作),為了幫助你在需要添加屬性的文件上添加屬性,Subversion提供了一些簡單但是有用的特性。 當你使用**svn add**或是**svn import**準備加入一個版本控制的文件時,Subversion會運行一個基本探測來檢查文件是包括了可讀還是不可讀的內容,如果Subversion猜測錯誤,或者是你希望使用`svn:mime-type`屬性更精確的設置―或許是`image/png`或者`application/x-shockwave-flash`―你可以一直刪除或編輯那個屬性。 Subversion也提供了自動屬性特性,允許你創建文件名到屬性名稱與值影射,這個影射在你的運行配置區域設置,它們會影響添加和導入操作,而且不僅僅會覆蓋Subversion所有缺省的MIME類型判斷操作,也會設置額外的Subversion或者自定義的屬性。舉個例子,你會創建一個影射文件說在任何時候你添加了一個JPEG文件―一些符合`*.jpg`的文件―Subversion一定會自動設置它們的`svn:mime-type`屬性為`image/jpeg`。或者是任何匹配`*.cpp`的文件,必須把`svn:eol-style`設置為`native`,并且`svn:keywords`設置為`Id`。自動屬性支持是Subversion工具箱中屬性相關最垂手可得的工具,見[“config”一節]來查看更多的配置支持。 修正提交日志信息的拼寫錯誤,文法錯誤和“簡單的錯誤”是`--revprop`選項最常見用例。 Windows文件系統使用文件擴展名(如`.EXE`、`.BAT`和`.COM`)來標示可執行文件。 這個模式對那個目錄是嚴格的―不會迭代的應用到子目錄。 這不是編譯系統的基本功能嗎? … 或者可能是一本書的一個小節 …
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看