# git-svn
> 原文: [https://git-scm.com/docs/git-svn](https://git-scm.com/docs/git-svn)
## 名稱
git-svn - Subversion存儲庫和Git之間的雙向操作
## 概要
```
git svn <command> [<options>] [<arguments>]
```
## 描述
_git svn_ 是Subversion和Git之間變更集的簡單管道。它提供Subversion和Git存儲庫之間的雙向變化流。
_git svn_ 可以使用--stdlayout選項跟蹤常見的“trunk / branches / tags”布局的標準Subversion存儲庫。它還可以使用-T / -t / -b選項跟隨任何布局中的分支和標簽(請參閱下面的 _init_ 選項,以及 _clone_ 命令)。
一旦跟蹤Subversion存儲庫(使用上述任何方法),就可以通過 _fetch_ 命令從Subversion更新Git存儲庫,并通過 _dcommit_ 命令從Git更新Subversion。
## COMMANDS
```
init
```
使用 _git svn_ 的其他元數據目錄初始化一個空的Git存儲庫。 Subversion URL可以指定為命令行參數,也可以指定為-T / -t / -b的完整URL參數。可選地,可以將要操作的目標目錄指定為第二個參數。通常,此命令初始化當前目錄。
```
-T<trunk_subdir>
```
```
--trunk=<trunk_subdir>
```
```
-t<tags_subdir>
```
```
--tags=<tags_subdir>
```
```
-b<branches_subdir>
```
```
--branches=<branches_subdir>
```
```
-s
```
```
--stdlayout
```
這些是init的可選命令行選項。這些標志中的每一個都可以指向相對存儲庫路徑(--tags = project / tags)或完整URL(--tags = https://foo.org/project/tags)。如果您的Subversion存儲庫在多個路徑下放置標記或分支,您可以指定多個--tags和/或--branches選項。選項--stdlayout是將trunk,tags,branches設置為相對路徑的簡便方法,這是Subversion的默認設置。如果同時給出任何其他選項,則它們優先。
```
--no-metadata
```
在[svn-remote]配置中設置 _noMetadata_ 選項。建議不要使用此選項,請在使用此選項之前閱讀本聯機幫助頁的 _svn.noMetadata_ 部分。
```
--use-svm-props
```
在[svn-remote]配置中設置 _useSvmProps_ 選項。
```
--use-svnsync-props
```
在[svn-remote]配置中設置 _useSvnsyncProps_ 選項。
```
--rewrite-root=<URL>
```
在[svn-remote]配置中設置 _rewriteRoot_ 選項。
```
--rewrite-uuid=<UUID>
```
在[svn-remote]配置中設置 _rewriteUUID_ 選項。
```
--username=<user>
```
對于SVN處理(http,https和plain svn)身份驗證的傳輸,請指定用戶名。對于其他傳輸(例如`svn+ssh://`),您必須在URL中包含用戶名,例如`svn+ssh://foo@svn.bar.com/project`
```
--prefix=<prefix>
```
如果指定了trunk / branches / tags,則允許指定前綴為遙控器名稱的前綴。前綴不會自動包含尾部斜杠,因此請確保在參數中包含一個前綴,如果這是您想要的。如果指定了--branches / -b,則前綴必須包含尾部斜杠。在任何情況下都強烈建議設置前綴(帶斜杠),因為你的SVN跟蹤引用將位于“refs / remotes / $ prefix / **”,這與Git自己的遠程跟蹤引用兼容layout(refs / remotes / $ remote /** )。如果要跟蹤共享公共存儲庫的多個項目,則設置前綴也很有用。默認情況下,前綴設置為 _origin /_ 。
| 注意 | 在Git v2.0之前,默認前綴是“”(沒有前綴)。這意味著SVN跟蹤引用被放在“refs / remotes / *”,這與Git自己的遠程跟蹤引用的組織方式不兼容。如果您仍然需要舊的默認值,可以通過在命令行上傳遞`--prefix ""`來獲取它(如果你的Perl的Getopt :: Long是< v2.37,`--prefix=""`可能不起作用)。 |
```
--ignore-refs=<regex>
```
傳遞給 _init_ 或 _clone_ 時,此正則表達式將作為配置鍵保留。有關`--ignore-refs`的說明,請參見 _fetch_ 。
```
--ignore-paths=<regex>
```
傳遞給 _init_ 或 _clone_ 時,此正則表達式將作為配置鍵保留。有關`--ignore-paths`的說明,請參見 _fetch_ 。
```
--include-paths=<regex>
```
傳遞給 _init_ 或 _clone_ 時,此正則表達式將作為配置鍵保留。有關`--include-paths`的說明,請參見 _fetch_ 。
```
--no-minimize-url
```
當跟蹤多個目錄(使用--stdlayout, - blank或--tags選項)時,git svn將嘗試連接到Subversion存儲庫的根目錄(或允許的最高級別)。如果整個項目在存儲庫中移動,則此默認設置允許更好地跟蹤歷史記錄,但可能會導致讀取訪問限制到位的存儲庫出現問題。傳遞`--no-minimize-url`將允許git svn按原樣接受URL,而不嘗試連接到更高級別的目錄。默認情況下,當僅跟蹤一個URL /分支時,此選項處于關閉狀態(這樣做不太好)。
```
fetch
```
從我們正在跟蹤的Subversion遠程獲取未經修改的修訂。 $ GIT_DIR / config文件中[svn-remote“...”]部分的名稱可以指定為可選的命令行參數。
如果需要,這會自動更新rev_map(有關詳細信息,請參閱下面的FILES部分中的 _$ GIT_DIR / svn / * \ * /。rev_map。*_ )。
```
--localtime
```
將Git提交時間存儲在本地時區而不是UTC中。這使 _git log_ (即使沒有--date = local)顯示與`svn log`在本地時區相同的時間。
這不會干擾與您克隆的Subversion存儲庫的互操作,但如果您希望本地Git存儲庫能夠與其他人的本地Git存儲庫進行互操作,請不要使用此選項,或者您應該同時使用它同一個當地時區。
```
--parent
```
僅從當前HEAD的SVN父級獲取。
```
--ignore-refs=<regex>
```
忽略與Perl正則表達式匹配的分支或標記的引用。像`^refs/remotes/origin/(?!tags/wanted-tag|wanted-branch).*$`這樣的“負前瞻斷言”可用于僅允許某些參考。
```
config key: svn-remote.<name>.ignore-refs
```
如果設置了ignore-refs配置鍵,并且還給出了命令行選項,則將使用兩個正則表達式。
```
--ignore-paths=<regex>
```
這允許指定Perl正則表達式,該表達式將導致從SVN的checkout跳過所有匹配路徑。 `--ignore-paths`選項應匹配每個 _fetch_ (包括_克隆_, _dcommit_ , _rebase_ 等)的自動提取)給定存儲庫。
```
config key: svn-remote.<name>.ignore-paths
```
如果設置了ignore-paths配置密鑰,并且還給出了命令行選項,則將使用兩個正則表達式。
例子:
```
Skip "doc*" directory for every fetch
```
```
--ignore-paths="^doc"
```
```
Skip "branches" and "tags" of first level directories
```
```
--ignore-paths="^[^/]+/(?:branches|tags)"
```
```
--include-paths=<regex>
```
這允許指定一個Perl正則表達式,該表達式將僅包含來自SVN的checkout的匹配路徑。 `--include-paths`選項應匹配每個 _fetch_ (包括_克隆_, _dcommit_ , _rebase_ 等)的自動提取)給定存儲庫。 `--ignore-paths`優先于`--include-paths`。
```
config key: svn-remote.<name>.include-paths
```
```
--log-window-size=<n>
```
獲取< n>掃描Subversion歷史記錄時每個請求的日志條目。默認值為100.對于非常大的Subversion存儲庫, _clone_ / _fetch_ 可能需要更大的值才能在合理的時間內完成。但過大的值可能會導致更高的內存使用量和請求超時。
```
clone
```
運行 _init_ 和_獲取_。它將根據傳遞給它的URL的基名自動創建一個目錄;或者如果第二個論點通過;它將創建一個目錄并在其中工作。它接受 _init_ 和 _fetch_ 命令接受的所有參數; `--fetch-all`和`--parent`除外。克隆存儲庫后, _fetch_ 命令將能夠在不影響工作樹的情況下更新修訂版;并且 _rebase_ 命令將能夠使用最新更改更新工作樹。
```
--preserve-empty-dirs
```
在本地Git存儲庫中為從Subversion獲取的每個空目錄創建一個占位符文件。這包括通過刪除Subversion存儲庫中的所有條目(但不是目錄本身)而變為空的目錄。不再需要時,也會跟蹤和刪除占位符文件。
```
--placeholder-filename=<filename>
```
設置--preserve-empty-dirs創建的占位符文件的名稱。默認值:“。gitignore”
```
rebase
```
這將從當前HEAD的SVN父級獲取修訂,并針對它重新定義當前(未提交到SVN)的工作。
這與`svn update`或 _git pull_ 類似,只是它保留 _git rebase_ 而不是 _git merge_ 的線性歷史,以便于 _git的同意svn_ 。
這接受 _git svn fetch_ 和 _git rebase_ 接受的所有選項。但是,`--fetch-all`僅從當前[svn-remote]獲取,而不是所有[svn-remote]定義。
像 _git rebase_ ;這要求工作樹清潔并且沒有未提交的更改。
如果需要,這會自動更新rev_map(有關詳細信息,請參閱下面的FILES部分中的 _$ GIT_DIR / svn / * \ * /。rev_map。*_ )。
```
-l
```
```
--local
```
不要遠程取;僅針對上游SVN上次提取的提交運行 _git rebase_ 。
```
dcommit
```
將每個diff從當前分支直接提交到SVN存儲庫,然后rebase或reset(取決于SVN和head之間是否存在差異)。這將在SVN中為Git中的每個提交創建一個修訂版本。
當可選的Git分支名稱(或Git提交對象名稱)被指定為參數時,子命令在指定的分支上工作,而不在當前分支上工作。
使用 _dcommit_ 優于 _set-tree_ (下文)。
```
--no-rebase
```
提交后,不要改變或重置。
```
--commit-url <URL>
```
提交此SVN URL(完整路徑)。這旨在允許使用一種傳輸方法創建的現有 _git svn_ 存儲庫(例如,用于匿名讀取的`svn://`或`http://`)如果用戶稍后被授權訪問備用傳輸方法(例如,用于提交的`svn+ssh://`或`https://`)。
```
config key: svn-remote.<name>.commiturl
config key: svn.commiturl (overwrites all svn-remote.<name>.commiturl options)
```
請注意,commiturl配置密鑰的SVN URL包括SVN分支。如果您想要為整個SVN存儲庫設置提交URL,請使用svn-remote。< name> .pushurl。
強烈建議不要將此選項用于任何其他目的(不要問)。
```
--mergeinfo=<mergeinfo>
```
在dcommit期間添加給定的合并信息(例如`--mergeinfo="/branches/foo:1-10"`)。所有svn服務器版本都可以存儲此信息(作為屬性),從1.5版開始的svn客戶端可以使用它。要指定來自多個分支的合并信息,請在分支之間使用單個空格字符(`--mergeinfo="/branches/foo:1-10 /branches/bar:3,5-6,8"`)
```
config key: svn.pushmergeinfo
```
此選項將導致git-svn嘗試在可能的情況下自動填充SVN存儲庫中的svn:mergeinfo屬性。目前,這只能在提交非快進合并時才能完成,其中除第一個之外的所有父級已經被推入SVN。
```
--interactive
```
要求用戶確認應該將補丁集實際發送到SVN。對于每個補丁,可以回答“是”(接受此補丁),“否”(丟棄此補丁),“全部”(接受所有補丁)或“退出”。
_git svn dcommit_ 如果回答為“no”或“quit”則立即返回,而不向SVN提交任何內容。
```
branch
```
在SVN存儲庫中創建分支。
```
-m
```
```
--message
```
允許指定提交消息。
```
-t
```
```
--tag
```
使用tags_subdir而不是git svn init期間指定的branches_subdir創建標記。
```
-d<path>
```
```
--destination=<path>
```
如果為 _init_ 或 _clone_ 命令提供了多個 - 分支(或--tags)選項,則必須提供您希望的分支(或標記)的位置在SVN存儲庫中創建。 <路徑>指定用于創建分支或標記的路徑,并且應該與其中一個已配置的分支或標記refspecs的左側模式匹配。您可以使用命令查看這些refspecs
```
git config --get-all svn-remote.<name>.branches
git config --get-all svn-remote.<name>.tags
```
其中< name>是 _init_ 的-R選項(默認情況下為“svn”)指定的SVN存儲庫的名稱。
```
--username
```
指定要執行提交的SVN用戶名。此選項會覆蓋_用戶名_配置屬性。
```
--commit-url
```
使用指定的URL連接到目標Subversion存儲庫。這在源SVN存儲庫是只讀的情況下很有用。此選項會覆蓋配置屬性 _commiturl_ 。
```
git config --get-all svn-remote.<name>.commiturl
```
```
--parents
```
創建父文件夾。此參數等效于參數--parents on svn cp命令,對非標準存儲庫布局很有用。
```
tag
```
在SVN存儲庫中創建標記。這是 _branch -t_ 的簡寫。
```
log
```
當svn用戶引用-r / - 版本號時,這應該可以很容易地查找svn日志消息。
支持'svn log'的以下功能:
```
-r <n>[:<n>]
```
```
--revision=<n>[:<n>]
```
支持,非數字args不是:HEAD,NEXT,BASE,PREV等...
```
-v
```
```
--verbose
```
它與svn log中的--verbose輸出不完全兼容,但相當接近。
```
--limit=<n>
```
與--max-count不同,不計算合并/排除的提交
```
--incremental
```
支持的
新功能:
```
--show-commit
```
還顯示了Git commit sha1
```
--oneline
```
我們的版本--pretty = oneline
| 注意 | SVN本身只存儲UTC時間,沒有別的。常規svn客戶端將UTC時間轉換為本地時間(或基于TZ =環境)。此命令具有相同的行為。 |
任何其他參數直接傳遞給 _git log_
```
blame
```
顯示修訂版和作者上次修改文件的每一行。默認情況下,此模式的輸出與'svn blame'的輸出格式兼容。與SVN blame命令一樣,忽略工作樹中的本地未提交更改; HEAD修訂版中的文件版本已注釋。未知參數直接傳遞給 _git blame_ 。
```
--git-format
```
以與 _git blame_ 相同的格式生成輸出,但使用SVN修訂號而不是Git提交哈希值。在此模式下,尚未提交到SVN的更改(包括本地工作副本編輯)顯示為修訂版0。
```
find-rev
```
當給定形式為 _rN_ 的SVN修訂號時,返回相應的Git提交哈希(這可以選擇后跟樹,以指定應搜索哪個分支)。給定tree-ish時,返回相應的SVN修訂號。
```
-B
```
```
--before
```
如果給出SVN修訂版,則不需要完全匹配,而是在指定的修訂版中找到與SVN存儲庫(在當前分支上)的狀態相對應的提交。
```
-A
```
```
--after
```
如果給出SVN修訂版,則不要求完全匹配;如果沒有完全匹配,則返回在歷史記錄中向前搜索的最接近的匹配。
```
set-tree
```
您應該考慮使用 _dcommit_ 而不是此命令。將指定的提交或樹對象提交給SVN。這取決于您導入的獲取數據是最新的。這使得在提交SVN時絕對不會嘗試進行修補,它只是用樹中指定的文件或提交覆蓋文件。假設所有合并都獨立于 _git svn_ 功能發生。
```
create-ignore
```
遞歸地在目錄上找到svn:ignore屬性并創建匹配的.gitignore文件。生成的文件將暫存,但未提交。使用-r / - revision來引用特定的修訂版。
```
show-ignore
```
遞歸查找并列出目錄上的svn:ignore屬性。輸出適合附加到$ GIT_DIR / info / exclude文件。
```
mkdirs
```
嘗試根據$ GIT_DIR / svn /< refname> /unhandled.log文件中的信息重新創建核心Git無法跟蹤的空目錄。使用“git svn clone”和“git svn rebase”時會自動重新創建空目錄,因此“mkdirs”適用于“git checkout”或“git reset”之類的命令。 (有關詳細信息,請參閱svn-remote。< name> .automkdirs配置文件選項。)
```
commit-diff
```
從命令行提交兩個tree-ish參數的diff。此命令不依賴于`git svn init` -ed存儲庫。該命令有三個參數,(a)要反對的原始樹,(b)新的樹結果,(c)目標Subversion存儲庫的URL。如果您使用的是 _git svn_ -aware存儲庫(已經`init`與 _git svn_ 一起使用),則可以省略最終參數(URL)。 -r< revision>此選項是必需的。
提交消息直接使用`-m`或`-F`選項提供,或者在第二個tree-ish表示此類對象時間接提供標記或提交,或者通過調用編輯器請求提交消息(請參閱`--edit`選項)下面)。
```
-m <msg>
```
```
--message=<msg>
```
使用給定的`msg`作為提交消息。此選項禁用`--edit`選項。
```
-F <filename>
```
```
--file=<filename>
```
從給定文件中獲取提交消息。此選項禁用`--edit`選項。
```
info
```
顯示與“svn info”提供的文件或目錄類似的信息。目前不支持-r / - revision參數。使用--url選項僅輸出 _URL:_字段的值。
```
proplist
```
列出存儲在Subversion存儲庫中的有關給定文件或目錄的屬性。使用-r / - revision來引用特定的Subversion修訂版。
```
propget
```
獲取作為文件的第一個參數給出的Subversion屬性。可以使用-r / - revision指定特定修訂。
```
propset
```
將作為第一個參數給出的Subversion屬性設置為作為第三個參數給出的文件的第二個參數給出的值。
例:
```
git svn propset svn:keywords "FreeBSD=%H" devel/py-tipper/Makefile
```
這將為文件 _devel / py-tipper / Makefile_ 設置屬性 _svn:keywords_ 到 _FreeBSD =%H_ 。
```
show-externals
```
顯示Subversion外部。使用-r / - revision指定特定修訂。
```
gc
```
壓縮$ GIT_DIR / svn /< refname> /unhandled.log文件并刪除$ GIT_DIR / svn /< refname> / index文件。
```
reset
```
將 _fetch_ 的效果撤消回指定的修訂版。這允許您重新_獲取_ SVN修訂版。通常,SVN修訂版的內容永遠不會改變,并且_重置_不應該是必需的。但是,如果SVN權限發生更改,或者您更改了--ignore-paths選項,則 _fetch_ 可能會失敗,并且“未在提交中找到”(文件以前未顯示)或“校驗和不匹配”(錯過了修改)。如果問題文件永遠不能被忽略(使用--ignore-paths)修復repo的唯一方法是使用 _reset_ 。
僅更改了rev_map和refs / remotes / git-svn(有關詳細信息,請參閱下面FILES部分中的 _$ GIT_DIR / svn / * \ * /。rev_map。*_ )。使用 _fetch_ 然后 _git reset_ 或 _git rebase_ 關注_重置_,將本地分支移動到新樹上。
```
-r <n>
```
```
--revision=<n>
```
指定要保留的最新修訂。所有后來的修訂都被丟棄了。
```
-p
```
```
--parent
```
同時丟棄指定的修訂版,保留最近的父版本。
```
Example:
```
假設您在“master”中有本地更改,但您需要重新獲取“r2”。
```
r1---r2---r3 remotes/git-svn
\
A---B master
```
修復了忽略路徑或SVN權限問題,導致“r2”首先不完整。然后:
```
git svn reset -r2 -p
git svn fetch
```
```
r1---r2'--r3' remotes/git-svn
\
r2---r3---A---B master
```
然后使用 _git rebase_ 修復“master”。不要使用 _git merge_ 或者您的歷史記錄將與以后的 _dcommit_ 不兼容!
```
git rebase --onto remotes/git-svn A^ master
```
```
r1---r2'--r3' remotes/git-svn
\
A'--B' master
```
## OPTIONS
```
--shared[=(false|true|umask|group|all|world|everybody)]
```
```
--template=<template_directory>
```
僅用于 _init_ 命令。這些直接傳遞給 _git init_ 。
```
-r <arg>
```
```
--revision <arg>
```
與 _fetch_ 命令一起使用。
這允許支持部分/燒灼歷史的修訂范圍。 $ NUMBER,$ NUMBER1:$ NUMBER2(數字范圍),$ NUMBER:HEAD和BASE:$ NUMBER均受支持。
這可以讓你在運行fetch時制作部分鏡像;但通常不推薦,因為歷史將被跳過和丟失。
```
-
```
```
--stdin
```
僅用于 _set-tree_ 命令。
從stdin讀取提交列表并以相反的順序提交它們。只從每一行讀取前導sha1,因此可以使用 _git rev-list --pretty = oneline_ 輸出。
```
--rmdir
```
僅用于 _dcommit_ , _set-tree_ 和 _commit-diff_ 命令。
如果沒有留下文件,則從SVN樹中刪除目錄。 SVN可以對空目錄進行編輯,如果沒有文件,則默認情況下不會刪除它們。 Git無法對空目錄進行版本控制。啟用此標志將使提交到SVN的行為與Git相同。
```
config key: svn.rmdir
```
```
-e
```
```
--edit
```
僅用于 _dcommit_ , _set-tree_ 和 _commit-diff_ 命令。
在提交SVN之前編輯提交消息。對于提交的對象,默認情況下處于關閉狀態,并且在提交樹對象時強制關閉。
```
config key: svn.edit
```
```
-l<num>
```
```
--find-copies-harder
```
僅用于 _dcommit_ , _set-tree_ 和 _commit-diff_ 命令。
它們都直接傳遞給 _git diff-tree_ ;有關詳細信息,請參閱 [git-diff-tree [1]](https://git-scm.com/docs/git-diff-tree) 。
```
config key: svn.l
config key: svn.findcopiesharder
```
```
-A<filename>
```
```
--authors-file=<filename>
```
語法與 _git cvsimport_ 使用的文件兼容,但_<>可以提供空的電子郵件地址。_ :
```
loginname = Joe User <user@example.com>
```
如果指定了此選項并且 _git svn_ 遇到作者文件中不存在的SVN提交者名稱, _git svn_ 將中止操作。然后,用戶必須添加適當的條目。修改authors文件后重新運行以前的 _git svn_ 命令應繼續操作。
```
config key: svn.authorsfile
```
```
--authors-prog=<filename>
```
如果指定了此選項,則對于authors文件中不存在的每個SVN提交者名稱,將使用提交者名稱作為第一個參數執行給定文件。該程序預計將返回“Name< email>”形式的單行或“名稱<>”,將被視為包含在作者文件中。
由于歷史原因,首先相對于 _init_ 和 _clone_ 的當前目錄搜索相對_文件名_并且相對于_的工作樹的根目錄獲取_。如果找不到_文件名_,則會像 _$ PATH_ 中的任何其他命令一樣進行搜索。
```
config key: svn.authorsProg
```
```
-q
```
```
--quiet
```
使 _git svn_ 不那么冗長。再次指定使其更簡潔。
```
-m
```
```
--merge
```
```
-s<strategy>
```
```
--strategy=<strategy>
```
```
-p
```
```
--preserve-merges
```
這些僅用于 _dcommit_ 和 _rebase_ 命令。
當使用 _dcommit_ 時,如果不能使用 _git reset_ ,則直接傳遞給 _git rebase_ (參見 _dcommit_ )。
```
-n
```
```
--dry-run
```
這可以與 _dcommit_ , _rebase_ ,_分支_和_標簽_命令一起使用。
對于 _dcommit_ ,打印出一系列Git參數,這些參數將顯示哪些差異將被提交給SVN。
對于 _rebase_ ,顯示與當前分支關聯的上游svn存儲庫關聯的本地分支以及將從中獲取的svn存儲庫的URL。
對于_分支_和_標簽_,顯示創建分支或標記時將用于復制的URL。
```
--use-log-author
```
當檢索svn提交到Git中時(作為 _fetch_ , _rebase_ 或 _dcommit_ 操作)的一部分,查找第一個`From:`或`Signed-off-by:`行日志消息并將其用作作者字符串。
```
config key: svn.useLogAuthor
```
```
--add-author-from
```
當從Git提交svn時(作為 _set-tree_ 或 _dcommit_ 操作的一部分),如果現有的日志消息還沒有`From:`或`Signed-off-by:`行,根據Git提交的作者字符串附加`From:`行。如果您使用此,則`--use-log-author`將為所有提交檢索有效的作者字符串。
```
config key: svn.addAuthorFrom
```
## 高級選項
```
-i<GIT_SVN_ID>
```
```
--id <GIT_SVN_ID>
```
這設置了GIT_SVN_ID(而不是使用環境)。這允許用戶在跟蹤單個URL時覆蓋默認的refname以從中獲取。 _log_ 和 _dcommit_ 命令不再需要此開關作為參數。
```
-R<remote name>
```
```
--svn-remote <remote name>
```
指定要使用的[svn-remote“< remote name>”]部分,這允許跟蹤SVN多個存儲庫。默認值:“svn”
```
--follow-parent
```
此選項僅在我們跟蹤分支時使用(使用其中一個存儲庫布局選項--trunk, - label, - blank, - stdlayout)。對于每個跟蹤的分支,嘗試找出其修訂版本的位置,并在分支的第一個Git提交中設置合適的父代。當我們跟蹤已在存儲庫中移動的目錄時,這尤其有用。如果禁用此功能, _git svn_ 創建的分支將全部為線性且不共享任何歷史記錄,這意味著沒有關于分支分支或合并的信息。但是,長時間/錯綜復雜的歷史記錄可能需要很長時間,因此禁用此功能可能會加快克隆過程。默認情況下啟用此功能,使用--no-follow-parent禁用它。
```
config key: svn.followparent
```
## 配置文件選項
```
svn.noMetadata
```
```
svn-remote.<name>.noMetadata
```
這會在每次提交結束時刪除 _git-svn-id:_行。
此選項只能用于一次性導入,因為 _git svn_ 無法在沒有元數據的情況下再次獲取。另外,如果你丟失 _$ GIT_DIR / svn / * \ * /。rev_map。*_ 文件, _git svn_ 將無法重建它們。
_git svn log_ 命令也不能在使用它的存儲庫上工作。使用這與 _useSvmProps_ 選項沖突(希望)顯而易見的原因。
建議不要使用此選項,因為這樣很難在現有文檔,錯誤報告和存檔中跟蹤對SVN修訂號的舊引用。如果您計劃最終從SVN遷移到Git并確定要刪除SVN歷史記錄,請考慮 [git-filter-branch [1]](https://git-scm.com/docs/git-filter-branch) 。 filter-branch還允許重新格式化元數據,以便于閱讀和重寫非“svn.authorsFile”用戶的作者信息。
```
svn.useSvmProps
```
```
svn-remote.<name>.useSvmProps
```
這允許 _git svn_ 從使用SVN :: Mirror(或svk)為元數據創建的鏡像重新映射存儲庫URL和UUID。
如果SVN修訂版具有屬性“svm:headrev”,則修訂版很可能是由SVN :: Mirror創建的(也是SVK使用的)。該屬性包含存儲庫UUID和修訂版。我們希望看起來像是在鏡像原始URL,因此引入一個輔助函數,它返回原始標識URL和UUID,并在提交消息中生成元數據時使用它。
```
svn.useSvnsyncProps
```
```
svn-remote.<name>.useSvnsyncprops
```
與useSvmProps選項類似;這適用于隨SVN 1.4.x及更高版本一起發布的svnsync(1)命令的用戶。
```
svn-remote.<name>.rewriteRoot
```
這允許用戶從備用URL創建存儲庫。例如,管理員可以在本地服務器上運行 _git svn_ (通過 [file://](file://) 訪問)但希望使用公共http://或svn:/分發存儲庫/元數據中的URL,以便用戶看到公共URL。
```
svn-remote.<name>.rewriteUUID
```
與useSvmProps選項類似;這適用于需要手動重新映射UUID的用戶。在通過useSvmProps或useSvnsyncProps無法使用原始UUID的情況下,這可能很有用。
```
svn-remote.<name>.pushurl
```
與Git的`remote.<name>.pushurl`類似,此密鑰設計用于 _url_ 通過只讀傳輸指向SVN存儲庫的情況,以提供備用讀/寫傳輸。假設兩個鍵都指向同一個存儲庫。與 _commiturl_ 不同, _pushurl_ 是基本路徑。如果可以使用 _commiturl_ 或 _pushurl_ , _commiturl_ 優先。
```
svn.brokenSymlinkWorkaround
```
這會禁用可能昂貴的檢查,以解決由損壞的客戶端檢入SVN的損壞的符號鏈接。如果跟蹤具有許多非符號鏈接的空blob的SVN存儲庫,請將此選項設置為“false”。當 _git svn_ 正在運行時,此選項可能會更改,并在下一個修訂版本生效時生效。如果未設置, _git svn_ 假定此選項為“true”。
```
svn.pathnameencoding
```
這指示git svn將路徑名重新編碼為給定的編碼。它可以被Windows用戶和非utf8語言環境中的用戶使用,以避免使用非ASCII字符損壞文件名。有效編碼是Perl的Encode模塊支持的編碼。
```
svn-remote.<name>.automkdirs
```
通常,“git svn clone”和“git svn rebase”命令會嘗試重新創建Subversion存儲庫中的空目錄。如果此選項設置為“false”,則只有在顯式運行“git svn mkdirs”命令時才會創建空目錄。如果未設置, _git svn_ 假定此選項為“true”。
由于noMetadata,rewriteRoot,rewriteUUID,useSvnsyncProps和useSvmProps選項都會影響 _git svn_ 生成和使用的元數據;在導入任何歷史記錄之前,它們**必須在配置文件中設置**,并且一旦設置這些設置就不應該更改。
此外,每個svn-remote部分只能使用其中一個選項,因為它們會影響 _git-svn-id:_元數據行,但可以一起使用的rewriteRoot和rewriteUUID除外。
## 基本實例
跟蹤并貢獻Subversion管理項目的主干(忽略標簽和分支):
```
# Clone a repo (like git clone):
git svn clone http://svn.example.com/project/trunk
# Enter the newly cloned directory:
cd trunk
# You should be on master branch, double-check with 'git branch'
git branch
# Do some work and commit locally to Git:
git commit ...
# Something is committed to SVN, rebase your local changes against the
# latest changes in SVN:
git svn rebase
# Now commit your changes (that were committed previously using Git) to SVN,
# as well as automatically updating your working HEAD:
git svn dcommit
# Append svn:ignore settings to the default Git exclude file:
git svn show-ignore >> .git/info/exclude
```
跟蹤并貢獻整個Subversion管理的項目(包括主干,標簽和分支):
```
# Clone a repo with standard SVN directory layout (like git clone):
git svn clone http://svn.example.com/project --stdlayout --prefix svn/
# Or, if the repo uses a non-standard directory layout:
git svn clone http://svn.example.com/project -T tr -b branch -t tag --prefix svn/
# View all branches and tags you have cloned:
git branch -r
# Create a new branch in SVN
git svn branch waldo
# Reset your master to trunk (or any other branch, replacing 'trunk'
# with the appropriate name):
git reset --hard svn/trunk
# You may only dcommit to one branch/tag/trunk at a time. The usage
# of dcommit/rebase/show-ignore should be the same as above.
```
最初的 _git svn clone_ 可能非常耗時(特別是對于大型Subversion存儲庫)。如果多個人(或一個擁有多臺機器的人)想要使用 _git svn_ 與同一個Subversion存儲庫進行交互,您可以將初始 _git svn clone_ 作為服務器上的存儲庫讓每個人用 _git clone_ 克隆該存儲庫:
```
# Do the initial import on a server
ssh server "cd /pub && git svn clone http://svn.example.com/project [options...]"
# Clone locally - make sure the refs/remotes/ space matches the server
mkdir project
cd project
git init
git remote add origin server:/pub/project
git config --replace-all remote.origin.fetch '+refs/remotes/*:refs/remotes/*'
git fetch
# Prevent fetch/pull from remote Git server in the future,
# we only want to use git svn for future updates
git config --remove-section remote.origin
# Create a local branch from one of the branches just fetched
git checkout -b master FETCH_HEAD
# Initialize 'git svn' locally (be sure to use the same URL and
# --stdlayout/-T/-b/-t/--prefix options as were used on server)
git svn init http://svn.example.com/project [options...]
# Pull the latest changes from Subversion
git svn rebase
```
## REBASE VS. PULL / MERGE
更喜歡使用 _git svn rebase_ 或 _git rebase_ ,而不是 _git pull_ 或 _git merge_ 來同步未整合的提交與 _git svn_ 分支。這樣做將使未集成提交的歷史相對于上游SVN存儲庫保持線性,并允許使用首選 _git svn dcommit_ 子命令將未集成的提交推送回SVN。
最初, _git svn_ 建議開發人員從 _git svn_ 分支中撤出或合并。這是因為作者贊成`git svn set-tree B`提交單個頭而不是`git svn set-tree A..B`符號來提交多個提交。使用 _git pull_ 或 _git merge_ 和`git svn set-tree A..B`將導致非線性歷史記錄在提交到SVN時被平鋪,這可能導致合并提交意外地反轉SVN中的先前提交。
## 合并跟蹤
雖然 _git svn_ 可以跟蹤采用標準布局的存儲庫的復制歷史記錄(包括分支和標記),但它還不能代表git內部發生在SVN用戶上游的合并歷史記錄。因此,建議用戶在Git內盡可能保持歷史記錄,以便于與SVN兼容(參見下面的CAVEATS部分)。
## 處理SVN分支機構
如果 _git svn_ 配置為獲取分支(并且--follow-branches有效),它有時會為一個SVN分支創建多個Git分支,其中附加分支的名稱為 _branchname @nnn_ (nnn是SVN版本號)。如果 _git svn_ 無法在SVN分支中找到第一次提交的父提交,則將分支連接到其他分支的歷史記錄,從而創建這些附加分支。
通常,SVN分支中的第一次提交包括復制操作。 _git svn_ 將讀取此提交以獲取創建分支的SVN修訂版。然后,它將嘗試查找與此SVN修訂版對應的Git提交,并將其用作分支的父級。但是,可能沒有合適的Git提交作為父級。除其他原因外,如果SVN分支是 _git svn_ 未提取的修訂版本的副本(例如因為它是`--revision`跳過的舊版本),或者如果在SVN中,復制了一個未被 _git svn_ 跟蹤的目錄(例如根本沒有跟蹤的分支,或被跟蹤分支的子目錄)。在這些情況下, _git svn_ 仍然會創建一個Git分支,但它不會使用現有的Git提交作為分支的父級,而是會讀取分支從中復制的目錄的SVN歷史記錄并創建適當的Git提交。這由消息“初始化父:< branchname>”表示。
此外,它將創建一個名為_< branchname> @< SVN-Revision>的特殊分支。_ ,其中< SVN-Revision>是從中復制分支的SVN修訂版號。該分支將指向新創建的分支的父提交。如果在SVN中分支被刪除并且稍后從不同版本重新創建,則將存在多個具有 _@_ 的分支。
請注意,這可能意味著為單個SVN修訂創建了多個Git提交。
例如:在具有標準中繼/標簽/分支布局的SVN存儲庫中,在r.100中創建目錄中繼/子。在r.200中,trunk / sub通過將其復制到branches /來分支。 _git svn clone -s_ 然后會創建一個分支 _sub_ 。它還將為r.100到r.199創建新的Git提交,并將它們用作分支 _sub_ 的歷史。因此,從r.100到r.199的每個修訂版將有兩個Git提交(一個包含trunk /,一個包含trunk / sub /)。最后,它將創建一個分支 _sub @ 200_ ,指向分支 _sub_ 的新父提交(即r.200和trunk / sub /的提交)。
## CAVEATS
為了簡單和與Subversion互操作,建議所有 _git svn_ 用戶直接從SVN服務器克隆,獲取和提交,并避免所有 _git clone_ / _拉_ / _合并_ / _推送_ Git存儲庫和分支之間的操作。在Git分支和用戶之間交換代碼的推薦方法是 _git format-patch_ 和 _git am_ ,或者只是'dcommit'ing到SVN存儲庫。
在您計劃 _dcommit_ 的分支上不建議運行 _git merge_ 或 _git pull_ ,因為Subversion用戶無法看到您所做的任何合并。此外,如果您從作為SVN分支鏡像的Git分支合并或拉出, _dcommit_ 可能會提交錯誤的分支。
如果你合并,請注意以下規則: _git svn dcommit_ 將嘗試在名為的SVN提交之上提交
```
git log --grep=^git-svn-id: --first-parent -1
```
你_必須_因此確保你想要提交的分支的最新提交是合并的_第一_父。否則會發生混亂,特別是如果第一個父級是同一SVN分支上的較舊提交。
_git clone_ 不會在refs / remotes / hierarchy或任何 _git svn_ 元數據或config下克隆分支。所以使用 _git svn_ 創建和管理的存儲庫應該使用 _rsync_ 進行克隆,如果要完成克隆的話。
由于 _dcommit_ 內部使用rebase,任何Git分支你 _git push_ 到 _dcommit_ 之前將需要強制覆蓋遠程存儲庫上的現有ref。這通常被認為是不好的做法,詳見 [git-push [1]](https://git-scm.com/docs/git-push) 文檔。
對于您已經提交的更改,請勿使用 [git-commit [1]](https://git-scm.com/docs/git-commit) 的--amend選項。將 - 已經推送到其他用戶的遠程存儲庫提交的提交視為不好的做法,并且與SVN的命令類似于此。
克隆SVN存儲庫時,如果沒有使用描述存儲庫布局的選項(--trunk, - targs, - .branches, - stdlayout), _git svn clone_ 將創建一個Git存儲庫具有完全線性歷史記錄,其中分支和標記在工作副本中顯示為單獨的目錄。雖然這是獲取完整存儲庫副本的最簡單方法,但對于具有多個分支的項目,它將導致工作副本比主干大許多倍。因此,對于使用標準目錄結構(主干/分支/標簽)的項目,建議使用選項`--stdlayout`進行克隆。如果項目使用非標準結構,和/或不需要分支和標記,則最簡單的方法是僅克隆一個目錄(通常是主干),而不提供任何存儲庫布局選項。如果需要帶分支和標簽的完整歷史記錄,則必須使用選項`--trunk` / `--branches` / `--tags`。
當使用多個 - 分支或--tags時, _git svn_ 不會自動處理名稱沖突(例如,如果來自不同路徑的兩個分支具有相同的名稱,或者分支和標記具有相同的名稱沖突名稱)。在這些情況下,使用 _init_ 設置你的Git存儲庫然后,在你的第一個 _fetch_ 之前,編輯$ GIT_DIR / config文件,以便分支和標簽與不同的名稱空間相關聯。例如:
```
branches = stable/*:refs/remotes/svn/stable/*
branches = debug/*:refs/remotes/svn/debug/*
```
## BUGS
我們忽略除svn:executable之外的所有SVN屬性。任何未處理的屬性都會記錄到$ GIT_DIR / svn /< refname> /unhandled.log
Git未檢測到重命名和復制的目錄,因此在提交SVN時不會進行跟蹤。我不打算為此添加支持,因為為所有可能的極端情況工作是非常困難和耗時的(Git也沒有這樣做)。如果它們足夠相似,Git可以檢測它們,則完全支持提交重命名和復制的文件。
在SVN中,可以(雖然不鼓勵)提交對標記的更改(因為標記只是目錄副本,因此在技術上與分支相同)。克隆SVN存儲庫時, _git svn_ 無法知道將來是否會發生對標記的提交。因此它保守地運作并將所有SVN標簽作為分支導入,在標簽名稱前加上_標簽/_ 。
## 組態
_git svn_ 將[svn-remote]配置信息存儲在存儲庫$ GIT_DIR / config文件中。它類似于核心Git [remote]部分,除了 _fetch_ 鍵不接受glob參數;但它們由_分支_和_標簽_鍵處理。由于某些SVN存儲庫奇怪地配置了多個項目,因此允許使用以下列出的擴展:
```
[svn-remote "project-a"]
url = http://server.org/svn
fetch = trunk/project-a:refs/remotes/project-a/trunk
branches = branches/*/project-a:refs/remotes/project-a/branches/*
branches = branches/release_*:refs/remotes/project-a/branches/release_*
branches = branches/re*se:refs/remotes/project-a/branches/*
tags = tags/*/project-a:refs/remotes/project-a/tags/*
```
請記住,本地參考的 _*_ (星號)通配符(_:_的右側)*必須*是最右邊的路徑組件;但是遠程通配符可以是任何地方,只要它是一個獨立的路徑組件(由 _/_ 或EOL包圍)。這種類型的配置不是由 _init_ 自動創建的,應該使用文本編輯器或使用 _git config_ 手動輸入。
另請注意,每個單詞只允許使用一個星號。例如:
```
branches = branches/re*se:refs/remotes/project-a/branches/*
```
將匹配分支_釋放_,_研究_, _re123se_ ,但
```
branches = branches/re*s*e:refs/remotes/project-a/branches/*
```
會產生錯誤。
也可以通過在大括號內使用逗號分隔的名稱列表來獲取分支或標記的子集。例如:
```
[svn-remote "huge-project"]
url = http://server.org/svn
fetch = trunk/src:refs/remotes/trunk
branches = branches/{red,green}/src:refs/remotes/project-a/branches/*
tags = tags/{1.0,2.0}/src:refs/remotes/project-a/tags/*
```
支持多個提取,分支和標記鍵:
```
[svn-remote "messy-repo"]
url = http://server.org/svn
fetch = trunk/project-a:refs/remotes/project-a/trunk
fetch = branches/demos/june-project-a-demo:refs/remotes/project-a/demos/june-demo
branches = branches/server/*:refs/remotes/project-a/branches/*
branches = branches/demos/2011/*:refs/remotes/project-a/2011-demos/*
tags = tags/server/*:refs/remotes/project-a/tags/*
```
在這樣的配置中創建分支需要使用-d或--destination標志消除使用哪個位置的歧義:
```
$ git svn branch -d branches/server release-2-3-0
```
請注意,git-svn會跟蹤分支或標記出現的最高版本。如果在獲取后更改了分支或標記的子集,則必須手動編輯$ GIT_DIR / svn / .metadata以根據需要刪除(或重置)branches-maxRev和/或tags-maxRev。
## FILES
```
$GIT_DIR/svn/*\*/.rev_map.*
```
Subversion修訂號和Git提交名之間的映射。在未設置noMetadata選項的存儲庫中,可以從每次提交結束時的git-svn-id:行重建(有關詳細信息,請參閱上面的 _svn.noMetadata_ 部分)。
_git svn fetch_ 和 _git svn rebase_ 會自動更新rev_map,如果它丟失或不是最新的。 _git svn reset_ 自動倒帶。
## 也可以看看
[git-rebase [1]](https://git-scm.com/docs/git-rebase)
## GIT
部分 [git [1]](https://git-scm.com/docs/git) 套件
- git
- git-config
- git-help
- git-init
- git-clone
- git-add
- git-status
- git-diff
- git-commit
- git-reset
- git-rm
- git-mv
- git-branch
- git-checkout
- git-merge
- git-mergetool
- git-log
- git-stash
- git-tag
- git-worktree
- git-fetch
- git-pull
- git-push
- git-remote
- git-submodule
- git-show
- git-log
- git-shortlog
- git-describe
- git-apply
- git-cherry-pick
- git-rebase
- git-revert
- git-bisect
- git-blame
- git-grep
- gitattributes
- giteveryday
- gitglossary
- githooks
- gitignore
- gitmodules
- gitrevisions
- gittutorial
- gitworkflows
- git-am
- git-format-patch
- git-send-email
- git-request-pull
- git-svn
- git-fast-import
- git-clean
- git-gc
- git-fsck
- git-reflog
- git-filter-branch
- git-instaweb
- git-archive
- git-bundle
- git-daemon
- git-update-server-info
- git-cat-file
- git-check-ignore
- git-checkout-index
- git-commit-tree
- git-count-objects
- git-diff-index
- git-for-each-ref
- git-hash-object
- git-ls-files
- git-merge-base
- git-read-tree
- git-rev-list
- git-rev-parse
- git-show-ref
- git-symbolic-ref
- git-update-index
- git-update-ref
- git-verify-pack
- git-write-tree