儲存庫強制設定 — 第 2/3 部分:自動屬性

本文經原始位置 http://blogs.collab.net/subversion/the-road-to-repository-dictated-configuration-day-2-autoprops 許可轉載。已移除或更新失效連結。

作者:Paul Burba

張貼 2013-06-25

自動屬性

在第 1 部分中,我討論了 Subversion 1.8 中新的可繼承屬性功能。我承諾此功能將為儲存庫強制設定 (RDC) 鋪路。今天,我將向您展示 1.8 的 RDC 相關功能的第一部分,新的 svn:auto-props 屬性。

等等…RDC 到底是什麼?

Subversion 提供一組廣泛的 使用者可設定選項,用來控制 Subversion 用戶端運作的各個面向。對於只有少數提交者在同一個位置的儲存庫來說,手動同步這些設定可能不是太困難。不過,對於較大型或分散的群組來說,要確保每個人都有相同的設定會變得越來越麻煩。Subversion 提供一個機制,透過 hook 腳本 來強制執行其中一些設定。不過,hook 腳本本質上只提供事後強制執行,hook 腳本可以拒絕設定不當的使用者提交,但它不會修正使用者的設定。

一個更好的解決方案是儲存庫指定的 1 設定,這些設定會以儲存庫範圍的設定無縫補充用戶端的設定,這些設定會套用在儲存庫上的運作,以及透過儲存庫的工作副本間接套用。這個領域中最常要求的功能之一是儲存庫指定的自動屬性設定值,Subversion 1.8 提供新的保留屬性 svn:auto-props 來提供這個功能。

1.8 之前的自動屬性

這是高階的複習,如需更多詳細資訊,請參閱 Subversion 版本控制手冊

在 Subversion 1.7 中,當您使用 svn add 或 svn import 子指令將檔案加入版本控制時,Subversion 會嘗試自動設定該檔案的共用屬性。其中一些屬性(例如 svn:executablesvn:mime-type)會在不考慮組態的情況下設定,而其他屬性(例如 svn:eol-style2則取決於您個別執行時期組態的詳細資料。這些組態可以使用 –config-option–config-dir 選項在命令列中覆寫。

我們今天有興趣的組態區段是 auto-props。在此區段中,您可以定義將自動設定在已新增/已匯入檔案上的屬性。例如,假設我們有這個組態 3

### Set enable-auto-props to 'yes' to enable automatic properties
### for 'svn add' and 'svn import', it defaults to 'no'.
### Automatic properties are defined in the section 'auto-props'.
enable-auto-props = yes

### Section for configuring automatic properties.
[auto-props]
### The format of the entries is:
###   file-name-pattern = propname[=value][;propname[=value]...]
### The file-name-pattern can contain wildcards (such as '*' and
### '?').  All entries which match (case-insensitively) will be
### applied to the file.  Note that auto-props functionality
### must be enabled, which is typically done by setting the
### 'enable-auto-props' option.
*.c = svn:eol-style=native
*.cpp = svn:eol-style=native
*.h = svn:keywords=Author Date Id Rev URL;svn:eol-style=native
*.dsp = svn:eol-style=CRLF
*.dsw = svn:eol-style=CRLF
*.sh = svn:eol-style=native;svn:executable
*.txt = svn:eol-style=native;svn:keywords=Author Date Id Rev URL;
*.png = svn:mime-type=image/png
*.jpg = svn:mime-type=image/jpeg
Makefile = svn:eol-style=native

在上述組態中,當我們將附檔名為 .c 的檔案置於版本控制之下時,該檔案會自動設定 svn:eol-style 屬性,其值為 native

1.8.0>svn st
?       src\panel.c

1.8.0>svn add src\panel.c
A         src\panel.c

1.8.0>svn proplist src\panel.c --verbose
Properties on 'src\panel.c':
  svn:eol-style
    native

很好,但如果我們是儲存庫管理員,我們必須依賴所有使用者手動設定他們的組態,就像這樣 4。如果有一種方法可以將儲存庫(或儲存庫中的專案)所需的自動屬性定義推送到使用者,那會更好 5

svn:auto-props 屬性

…輸入新的 svn:auto-props 屬性。此新屬性的值應與自動屬性執行時期組態選項的格式相同:任何數量的換行分隔的鍵值對,格式為 FILE_PATTERN = PROPNAME=VALUE[;PROPNAME=VALUE ...])。

我們可能在儲存庫的根目錄上設定 svn:auto-props 屬性,其值與我們先前範例中的執行時期組態非常類似

1.8.0>svn pg svn:auto-props http://svn.example.com/repos --verbose
Properties on 'http://svn.example.com/repos':
  svn:auto-props
    *.c = svn:eol-style=native
    *.cpp = svn:eol-style=native
    *.h = svn:keywords=Author Date Id Rev URL;svn:eol-style=native
    *.dsp = svn:eol-style=CRLF
    *.dsw = svn:eol-style=CRLF
    *.sh = svn:eol-style=native;svn:executable
    *.txt = svn:eol-style=native;svn:keywords=Author Date Id Rev URL;
    *.png = svn:mime-type=image/png
    *.jpg = svn:mime-type=image/jpeg
    Makefile = svn:eol-style=native

svn:auto-props 屬性的值會為繼承此屬性的目錄位置中新增或匯入的任何路徑定義自動屬性。

範例:從儲存庫根目錄繼承的 svn:auto-props

讓我們來看一個非常簡單的範例,說明新屬性如何用於設定自動屬性。假設我們在執行時期組態中未定義任何自動屬性

### Set enable-auto-props to 'yes' to enable automatic properties
### for 'svn add' and 'svn import', it defaults to 'no'.
### Automatic properties are defined in the section 'auto-props'.
enable-auto-props = no

此外,假設我們的儲存庫管理員先前在儲存庫的根目錄上設定 svn:auto-props 屬性 6

1.8.0>svn propget svn:auto-props --verbose -R http://svn.example.com/repos
Properties on 'http://svn.example.com/repos':
  svn:auto-props
    *.c = svn:eol-style=native
    *.h = svn:eol-style=native
    *.py = svn:eol-style=native

我們為目前專案簽出新的工作副本

1.8.0>svn co http://svn.example.com/repos/calc/trunk calc-trunk-wc
A    calc-trunk-wc\doc
A    calc-trunk-wc\src
A    calc-trunk-wc\doc\INSTALL
A    calc-trunk-wc\FAQ
A    calc-trunk-wc\src\button.c
A    calc-trunk-wc\src\integer.c
A    calc-trunk-wc\src\real.c
A    calc-trunk-wc\src\main.c
A    calc-trunk-wc\Makefile
A    calc-trunk-wc\README
 U   calc-trunk-wc
Checked out revision 480.

完成一些工作後,我們有一個新檔案想要置於版本控制之下

1.8.0>svn st calc-trunk-wc
?       calc-trunk-wc\src\bindings.h

1.8.0>svn add calc-trunk-wc\src\bindings.h
A         calc-trunk-wc\src\bindings.h

當我們這麼做時,svn:auto-props 屬性從儲存庫的根目錄繼承而來,結果在新增的檔案上自動設定 svn_eol-style 屬性

1.8.0>svn pg svn:auto-props -v --show-inherited-props calc-trunk-wc\src\bindings.h
Inherited properties on 'calc-trunk-wc\src\bindings.h',
from 'http://svn.example.com/repos':
  svn:auto-props
    *.c = svn:eol-style=native
    *.h = svn:eol-style=native
    *.py = svn:eol-style=native

1.8.0>svn pl -v calc-trunk-wc\src\bindings.h
Properties on 'calc-trunk-wc\src\bindings.h':
  svn:eol-style
    native

自動屬性的層級

前一個範例可能是您會遇到的最簡單的 svn:auto-props 案例。但如果

在這些案例中,套用下列規則

A) svn:auto-props 覆寫執行時期設定的自動屬性:針對特定模式定義在 svn:auto-props 中的自動屬性,會覆寫自動屬性執行時期設定中 相同 模式的自動屬性 7

B) 較近的 svn:auto-props 優先:如果針對 相同 模式的自動屬性從多個父目錄的 svn:auto-props 屬性繼承而來,則路徑較近的父目錄會覆寫較遠的父目錄。

C) 明確的 svn:auto-props 優先於繼承的屬性:針對特定模式定義在明確設定於路徑上的 svn:auto-props 屬性中的自動屬性,會覆寫從任何父目錄繼承而來的相同模式的自動屬性。

D) 如果一個檔案符合多個模式,則不保證:就像自動屬性執行時期設定選項一樣,如果一個檔案符合多個檔案模式,而這些模式為同一個屬性定義值,則無法保證哪個模式的值會自動套用。例如,如果新增的檔案 foo.py 繼承這兩個值,

*.py = svn:eol-style=native
*.p* = svn:eol-style=CRLF

那麼,無法保證會在新增的檔案 foo.py 設定哪一種 eol-style。

E) --no-auto-props 表示沒有自動屬性:如同 auto-props 執行時期選項,在命令列中使用 --no-auto-props 選項時,將會忽略 svn:auto-props 屬性。

F) 停用執行時期設定中的自動屬性,不會影響 RDC:當 enable-auto-props 執行時期設定選項設為否時,不會停用 svn:auto-props

<pre>### Set enable-auto-props to 'yes' to enable automatic properties
### for 'svn add' and 'svn import', it defaults to 'no'.
### Automatic properties are defined in the section 'auto-props'.
### Note: Setting this option to 'no' has no effect on the behavior of
### the svn:auto-props property
enable-auto-props = no</pre>
<

應該放在哪裡?

請記住,svn:auto-props 是可繼承的。因此,通常只需要在儲存庫的根目錄設定屬性。如果您的儲存庫有數個需要不同設定的不同專案,則可以將屬性放在每個專案的根資料夾中 8。請記住,對於繼承的屬性,越少越好 — 如果您設定 svn:auto-props,使得某個儲存庫路徑從多個父項繼承相同的值,那麼您可能做的事情超過您需要的。

附註

  1. 完全公開:在此討論的儲存庫「指示」設定,對於行為良好的 1.8+ 客戶端來說,真的只是建議而已。較舊的客戶端顯然無法理解新的指示。即使使用較新的客戶端,使用者也可以相對容易地修改客戶端,以忽略伺服器端的建議 — 畢竟,Subversion開放原始碼的!考量到這個現實,如果您需要 100% 保證的相容性,仍然建議透過掛勾指令碼,在伺服器端強制執行所需的行為。

  2. svn:mime-type 實際上屬於這兩個類別 — 它可以透過執行時間設定進行設定,但如果在那裡沒有定義任何內容,Subversion 會嘗試透過一組硬編碼規則自動設定 mime 類型。

  3. 我承認這裡有一個簡化 — 不只有一個使用者設定,它可以在最多 4 個位置中定義

    1. 每個使用者的執行時間設定
    2. 每個使用者的登錄值 (僅限 Windows)
    3. 每個電腦的執行時間設定
    4. 系統範圍的登錄值 (僅限 Windows)

    編號較低的設定優先於編號較高的設定。在這個部落格的範例中,為了簡化起見,我們假設設定 #2 到 #4 是空的,而且我們的整個設定僅在 #1 中定義。

  4. Subversion 在其預設設定中沒有設定任何自動屬性

  5. 即儲存庫指示的設定!

  6. 請注意,svn:auto-props 屬性只能設定在目錄上。

  7. 標準執行時間設定或 --config-dir 選項所指出的設定。

  8. 從第 1 部分回憶,所有使用者必須對你設定 svn:auto-props 的任何目錄具有讀取權限,否則他們將無法從該路徑繼承。

關於作者

Paul Burba 是 Apache 軟體基金會的 Subversion 專案的提交者,過去九年來一直從事 Subversion 的工作。他為 Collabnet 擔任軟體工程師,在家鄉新罕布夏州工作,當他沒有在寫程式碼時,通常可以發現他與姪子們一起滑雪、與朋友們一起騎登山車,或與妻子一起旅行。在遙遠的過去,Paul 曾從新罕布夏大學畢業,取得商業學位。最近,他從波士頓大學取得電腦科學碩士學位。