?
Dokumen ini menggunakan Manual laman web PHP Cina Lepaskan
git-svn - Subversion版本庫和Git之間的雙向操作
git svn <command> [options] [arguments]
git svn
是Subversion和Git之間變更集的簡(jiǎn)單渠道。它提供了Subversion和Git存儲(chǔ)庫之間的雙向變化流。
git svn
可以跟蹤常見的“trunk / branches / tags”布局,并使用--stdlayout選項(xiàng)來跟蹤標(biāo)準(zhǔn)的Subversion存儲(chǔ)庫。它也可以使用-T / -t / -b選項(xiàng)在任何布局中跟隨分支和標(biāo)簽(請(qǐng)參閱init
下面的選項(xiàng)以及clone
命令)。
一旦跟蹤Subversion存儲(chǔ)庫(使用上述任何方法),可以通過fetch
命令從Subversion更新Git存儲(chǔ)庫,并通過命令從Git更新Subversion dcommit
。
init
使用其他元數(shù)據(jù)目錄初始化一個(gè)空的Git存儲(chǔ)庫git svn
??梢詫ubversion URL指定為命令行參數(shù),或者將其指定為-T / -t / -b的完整URL參數(shù)。或者,可以將要操作的目標(biāo)目錄指定為第二個(gè)參數(shù)。通常這個(gè)命令初始化當(dāng)前目錄。
-T<trunk_subdir> --trunk=<trunk_subdir> -t<tags_subdir> --tags=<tags_subdir> -b<branches_subdir> --branches=<branches_subdir> -s --stdlayout
這些是init的可選命令行選項(xiàng)。每個(gè)標(biāo)志都可以指向相對(duì)的存儲(chǔ)庫路徑(--tags = project / tags)或完整的url(--tags = https://foo.org/project/tags)。您可以指定多個(gè)--tags和/或--branches選項(xiàng),以防Subversion存儲(chǔ)庫將標(biāo)簽或分支置于多個(gè)路徑下。選項(xiàng)--stdlayout是將trunk,tags,branches設(shè)置為相對(duì)路徑的簡(jiǎn)寫方式,這是Subversion的默認(rèn)設(shè)置。如果還有其他任何選項(xiàng),則優(yōu)先。
--no-metadata
noMetadata
在svn-remote配置中設(shè)置選項(xiàng)。不建議svn.noMetadata
使用此選項(xiàng),請(qǐng)?jiān)谑褂么诉x項(xiàng)之前閱讀該手冊(cè)頁的部分。
--use-svm-props
useSvmProps
在svn-remote配置中設(shè)置選項(xiàng)。
--use-svnsync-props
useSvnsyncProps
在svn-remote配置中設(shè)置選項(xiàng)。
--rewrite-root=<URL>
rewriteRoot
在svn-remote配置中設(shè)置選項(xiàng)。
--rewrite-uuid=<UUID>
rewriteUUID
在svn-remote配置中設(shè)置選項(xiàng)。
--username=<user>
對(duì)于SVN處理(http,https和普通svn)身份驗(yàn)證的傳輸,請(qǐng)指定用戶名。對(duì)于其他傳輸(例如svn+ssh://
),您必須在URL中包含用戶名,例如svn+ssh://foo@svn.bar.com/project
--prefix=<prefix>
如果指定了trunk / branches / tags,這允許指定一個(gè)前綴作為遠(yuǎn)程名稱的前綴。前綴不會(huì)自動(dòng)包含結(jié)尾的斜杠,因此如果這是您想要的,請(qǐng)確保在參數(shù)中包含一個(gè)。如果指定了--branches / -b,則前綴必須包含尾部斜線。在任何情況下都強(qiáng)烈建議設(shè)置前綴(使用尾部斜線),因?yàn)槟腟VN跟蹤引用將位于“refs / remotes / $ prefix / ”,這與Git自己的遠(yuǎn)程跟蹤引用布局兼容(參考文獻(xiàn)/遠(yuǎn)程/ $遠(yuǎn)程/)。如果您希望跟蹤共享公共存儲(chǔ)庫的多個(gè)項(xiàng)目,那么設(shè)置前綴也很有用。默認(rèn)情況下,前綴設(shè)置為origin/
。
注意 | 在Git v2.0之前,默認(rèn)的前綴是“”(無前綴)。這意味著SVN跟蹤文件被放在“refs / remotes / *”,這與Git自己的遠(yuǎn)程跟蹤文件的組織方式不兼容。如果你仍然想要舊的默認(rèn)值,可以通過在命令行上傳遞--prefix“”來獲得它(如果你的Perl的Getopt :: Long是<v2.37,那么--prefix =“”可能不起作用)。 |
---|
--ignore-refs=<regex>
當(dāng)傳遞給init
或clone
正則表達(dá)式將被保存為配置密鑰。請(qǐng)參閱fetch
有關(guān)說明--ignore-refs
。
--ignore-paths=<regex>
當(dāng)傳遞給init
或clone
正則表達(dá)式將被保存為配置密鑰。請(qǐng)參閱fetch
有關(guān)說明--ignore-paths
。
--include-paths=<regex>
當(dāng)傳遞給init
或clone
正則表達(dá)式將被保存為配置密鑰。請(qǐng)參閱fetch
有關(guān)說明--include-paths
。
--no-minimize-url
當(dāng)跟蹤多個(gè)目錄(使用--stdlayout, - branch或-tags選項(xiàng))時(shí),git svn將嘗試連接到Subversion存儲(chǔ)庫的根(或最高允許級(jí)別)。如果整個(gè)項(xiàng)目在存儲(chǔ)庫中移動(dòng),則此默認(rèn)值允許更好地跟蹤歷史記錄,但可能會(huì)導(dǎo)致存在讀取訪問限制的存儲(chǔ)庫中出現(xiàn)問題。傳遞--no-minimize-url
將允許git svn按原樣接受URL,而不嘗試連接到更高級(jí)別的目錄。當(dāng)只有一個(gè)URL /分支被跟蹤時(shí),這個(gè)選項(xiàng)默認(rèn)是關(guān)閉的(它不會(huì)有什么好處)。
fetch
從我們正在跟蹤的Subversion遠(yuǎn)程獲取未提取的修訂。$ GIT_DIR / config文件中的svn-remote“...”部分的名稱可以指定為可選的命令行參數(shù)。
如果需要,這會(huì)自動(dòng)更新rev_map($GIT_DIR/svn/*\*/.rev_map.*
有關(guān)詳細(xì)信息,請(qǐng)參閱下面的FILES部分)。
--localtime
將Git提交時(shí)間存儲(chǔ)在本地時(shí)區(qū)而不是UTC。這使得git log
(甚至沒有--date = local)顯示與svn log
當(dāng)?shù)貢r(shí)區(qū)相同的時(shí)間。
這并不妨礙與克隆的Subversion版本庫的互操作,但如果您希望本地Git存儲(chǔ)庫能夠與其他人的本地Git存儲(chǔ)庫互操作,則不要使用此選項(xiàng),或者您都應(yīng)該使用它相同的當(dāng)?shù)貢r(shí)區(qū)。
--parent
僅從當(dāng)前HEAD的SVN父節(jié)點(diǎn)獲取。
--ignore-refs=<regex>
忽略與Perl正則表達(dá)式匹配的分支或標(biāo)記的引用。“負(fù)面預(yù)測(cè)斷言” ^refs/remotes/origin/(?!tags/wanted-tag|wanted-branch).*$
可以用來僅允許某些參考。
config key: svn-remote.<name>.ignore-refs
如果ignore-refs配置鍵已設(shè)置,并且還提供了命令行選項(xiàng),則將使用這兩個(gè)正則表達(dá)式。
--ignore-paths=<regex>
這允許指定一個(gè)Perl正則表達(dá)式,這會(huì)導(dǎo)致SVN從結(jié)帳中跳過所有匹配的路徑。該--ignore-paths
選項(xiàng)應(yīng)與每一個(gè)fetch
(包括自動(dòng)取因clone
,dcommit
,rebase
,等)在給定的存儲(chǔ)庫。
config key: svn-remote.<name>.ignore-paths
如果設(shè)置了ignore-paths配置鍵,并且還給出了命令行選項(xiàng),則將使用這兩個(gè)正則表達(dá)式。
例子:
每次抓取跳過“doc *”目錄
--ignore-paths="^doc"
跳過第一級(jí)目錄的“分支”和“標(biāo)簽”
--ignore-paths="^[^/]+/(?:branches|tags)"
--include-paths=<regex>
這樣可以指定一個(gè)Perl正則表達(dá)式,這會(huì)導(dǎo)致只包含從SVN簽出的匹配路徑。該--include-paths
選項(xiàng)應(yīng)與每一個(gè)fetch
(包括自動(dòng)取因clone
,dcommit
,rebase
,等)在給定的存儲(chǔ)庫。--ignore-paths
優(yōu)先--include-paths
。
config key: svn-remote.<name>.include-paths
--log-window-size=<n>
掃描Subversion歷史記錄時(shí),每個(gè)請(qǐng)求獲取<n>日志條目。默認(rèn)值為100對(duì)于非常大的Subversion資料庫中,可能需要較大的值clone
/ fetch
在合理的時(shí)間內(nèi)完成。但過大的值可能會(huì)導(dǎo)致更高的內(nèi)存使用量和請(qǐng)求超時(shí)。
clone
運(yùn)行init
和fetch
。它會(huì)根據(jù)傳遞給它的URL的基名自動(dòng)創(chuàng)建一個(gè)目錄; 或者是否傳遞了第二個(gè)參數(shù); 它會(huì)創(chuàng)建一個(gè)目錄并在其中工作。它接受init
和fetch
命令接受的所有參數(shù); 除了--fetch-all
和--parent
??寺〈鎯?chǔ)庫后,該fetch
命令將能夠更新修訂版而不影響工作樹; 并且該rebase
命令將能夠使用最新更改更新工作樹。
--preserve-empty-dirs
在本地Git存儲(chǔ)庫中為從Subversion提取的每個(gè)空目錄創(chuàng)建一個(gè)占位符文件。這包括通過刪除Subversion存儲(chǔ)庫中的所有條目(但不包括目錄本身)而變空的目錄。當(dāng)不再需要時(shí),占位符文件也被跟蹤和刪除。
--placeholder-filename=<filename>
設(shè)置由--preserve-empty-dirs創(chuàng)建的占位符文件的名稱。默認(rèn):“.gitignore”
rebase
這會(huì)從當(dāng)前HEAD的SVN父節(jié)點(diǎn)獲取修訂,并將當(dāng)前(未提交到SVN)的工作重新綁定到它。
這與其相似svn update
或git pull
除了它保留了線性歷史記錄git rebase
而不是git merge
為了方便提交git svn
。
這接受所有選項(xiàng)git svn fetch
并git rebase
接受。但是,--fetch-all
只能從當(dāng)前的svn-remote中獲取,而不是所有的svn-remote定義。
像git rebase
; 這要求工作樹干凈并且沒有未提交的更改。
如果需要,這會(huì)自動(dòng)更新rev_map($GIT_DIR/svn/*\*/.rev_map.*
有關(guān)詳細(xì)信息,請(qǐng)參閱下面的FILES部分)。
-l --local
不要遠(yuǎn)程獲取; 僅git rebase
針對(duì)上游SVN上次提交的提交運(yùn)行。
dcommit
將當(dāng)前分支中的每個(gè)diff直接提交到SVN存儲(chǔ)庫,然后重新綁定或重置(取決于SVN和head之間是否存在差異)。這將在Git中為每個(gè)提交創(chuàng)建SVN修訂。
當(dāng)一個(gè)可選的Git分支名稱(或Git提交對(duì)象名稱)被指定為參數(shù)時(shí),子命令在指定的分支上工作,而不是在當(dāng)前分支上。
使用dcommit
優(yōu)于set-tree
(下面)。
--no-rebase
提交后,不要重新設(shè)置或重置。
--commit-url <URL>
提交到這個(gè)SVN URL(完整路徑)。這樣做的目的在于,如果稍后用戶可以訪問替代傳輸方法(例如或)來提交,那么允許git svn
使用一種傳輸方法(例如svn://
或http://
用于匿名讀?。﹦?chuàng)建的現(xiàn)有存儲(chǔ)庫被重用。svn+ssh://https://
config key: svn-remote.<name>.commiturl config key: svn.commiturl (overwrites all svn-remote.<name>.commiturl options)
請(qǐng)注意,commiturl config密鑰的SVN URL包含SVN分支。如果您想為整個(gè)SVN存儲(chǔ)庫設(shè)置提交URL,請(qǐng)改為使用svn-remote。<name> .pushurl。
使用這個(gè)選項(xiàng)用于任何其他目的(不要問)非常不鼓勵(lì)。
--mergeinfo=<mergeinfo>
在dcommit(eg --mergeinfo="/branches/foo:1-10"
)期間添加給定的合并信息。所有的svn服務(wù)器版本都可以存儲(chǔ)這些信息(作為一個(gè)屬性),從1.5版開始的svn客戶端可以使用它。要從多個(gè)分支指定合并信息,請(qǐng)?jiān)诜种еg使用單個(gè)空格字符(--mergeinfo="/branches/foo:1-10 /branches/bar:3,5-6,8"
)
config key: svn.pushmergeinfo
這個(gè)選項(xiàng)會(huì)導(dǎo)致git-svn在可能的情況下嘗試自動(dòng)填充SVN信息庫中的svn:mergeinfo屬性。目前,只有在提交非快進(jìn)合并的情況下,只有第一個(gè)父母已經(jīng)被推入SVN的情況下才能完成此操作。
--interactive
要求用戶確認(rèn)補(bǔ)丁集應(yīng)該實(shí)際發(fā)送給SVN。對(duì)于每個(gè)補(bǔ)丁,可以回答“是”(接受此補(bǔ)丁),“否”(丟棄此補(bǔ)?。?,“全部”(接受所有補(bǔ)丁)或“退出”。
git svn dcommit
如果回答為“否”或“退出”,則立即返回,但不向SVN提交任何內(nèi)容。
branch
在SVN存儲(chǔ)庫中創(chuàng)建一個(gè)分支。
-m --message
允許指定提交消息。
-t --tag
通過使用tags_subdir而不是在git svn init期間指定的branches_subdir創(chuàng)建一個(gè)標(biāo)簽。
-d<path> --destination=<path>
如果給init
or clone
命令提供了多個(gè)--branches(或--tags)選項(xiàng),則必須提供您希望在SVN存儲(chǔ)庫中創(chuàng)建的分支(或標(biāo)簽)的位置。<path>指定用于創(chuàng)建分支或標(biāo)記的路徑,并且應(yīng)該與其中一個(gè)配置的分支或標(biāo)記refspecs的左側(cè)的模式相匹配。您可以使用這些命令查看這些refspecs
git config --get-all svn-remote.<name>.branches git config --get-all svn-remote.<name>.tags
其中<name>是由-R選項(xiàng)init
(默認(rèn)情況下為“svn”)指定的SVN存儲(chǔ)庫的名稱。
--username
指定SVN用戶名以執(zhí)行提交。該選項(xiàng)覆蓋username
配置屬性。
--commit-url
使用指定的URL連接到目標(biāo)Subversion存儲(chǔ)庫。這在源SVN存儲(chǔ)庫為只讀的情況下非常有用。該選項(xiàng)覆蓋配置屬性commiturl
。
git config --get-all svn-remote.<name>.commiturl
--parents
創(chuàng)建父文件夾。此參數(shù)等同于svn cp命令中的參數(shù)--parents,對(duì)于非標(biāo)準(zhǔn)存儲(chǔ)庫布局非常有用。
tag
在SVN存儲(chǔ)庫中創(chuàng)建一個(gè)標(biāo)簽。這是一個(gè)簡(jiǎn)寫branch -t
。
log
當(dāng)svn用戶引用-r / - 修訂號(hào)時(shí),這應(yīng)該能夠輕松查找svn日志消息。
'svn log'支持以下功能:
-r <n>:<n> --revision=<n>:<n>
支持,非數(shù)字參數(shù)不是:HEAD,NEXT,BASE,PREV等...
-v --verbose
它不完全兼容svn日志中的--verbose輸出,但相當(dāng)接近。
--limit=<n>
與--max-count不同,不會(huì)計(jì)入合并/排除提交
--incremental
支持的
新功能:
--show-commit
也顯示了Git commit sha1
--oneline
我們的版本--pretty = oneline
注意 | SVN本身只存儲(chǔ)UTC時(shí)間,沒有別的。常規(guī)svn客戶端將UTC時(shí)間轉(zhuǎn)換為當(dāng)?shù)貢r(shí)間(或基于TZ =環(huán)境)。該命令具有相同的行為。 |
---|
任何其他參數(shù)都直接傳遞給 git log
blame
顯示修訂版本和作者上次修改文件的每一行。默認(rèn)情況下,此模式的輸出格式與'svn blame'的輸出格式兼容。像SVN blame命令一樣,工作樹中的本地未提交更改將被忽略; HEAD修訂版本中的文件版本被注釋。未知參數(shù)直接傳遞給git blame
。
--git-format
git blame
以與SVN版本號(hào)相同的格式生成輸出,而不是Git提交哈希。在此模式下,尚未提交給SVN的更改(包括本地工作副本編輯)顯示為修訂版0。
find-rev
當(dāng)給定表單的SVN修訂號(hào)時(shí)rN
,返回相應(yīng)的Git提交散列(可以選擇后跟一個(gè)tree-ish來指定應(yīng)該搜索哪個(gè)分支)。當(dāng)給定樹時(shí),返回相應(yīng)的SVN修訂版號(hào)。
-B --before
如果給定SVN修訂版,不要求完全匹配,而是在指定修訂版中找到與SVN存儲(chǔ)庫(在當(dāng)前分支上)相對(duì)應(yīng)的提交。
-A --after
如果提供SVN修訂版本,則不需要完全匹配; 如果沒有完全匹配,則返回在歷史中向前搜索的最接近的匹配。
set-tree
你應(yīng)該考慮使用dcommit
而不是這個(gè)命令。將指定的提交或樹對(duì)象提交給SVN。這依賴于您導(dǎo)入的提取數(shù)據(jù)是最新的。這絕對(duì)不會(huì)嘗試在提交SVN時(shí)進(jìn)行修補(bǔ),它只會(huì)覆蓋樹中指定的文件或提交的文件。假定所有合并都是獨(dú)立于git svn
功能而發(fā)生的。
create-ignore
遞歸查找目錄上的 svn:ignore 屬性并創(chuàng)建匹配的 .gitignore 文件。生成的文件被分階段提交,但未提交。使用 -r / - revision 來引用特定的版本。
show-ignore
遞歸查找并列出目錄上的 svn:ignore 屬性。輸出適用于追加到 $ GIT_DIR / info / exclude 文件。
mkdirs
嘗試根據(jù)$ GIT_DIR / svn / <refname> /unhandled.log文件中的信息重新創(chuàng)建核心 Git 無法跟蹤的空目錄。空目錄在使用“git svn clone”和“git svn rebase”時(shí)會(huì)自動(dòng)重新創(chuàng)建,因此“mkdirs”適用于諸如“git checkout”或“git reset”之類的命令之后。(有關(guān)更多信息,請(qǐng)參見 svn-remote。<name> .automkdirs 配置文件選項(xiàng)。)
commit-diff
提交命令行中兩個(gè)樹型參數(shù)的差異。該命令不依賴于在git svn init
-ed存儲(chǔ)庫中。這個(gè)命令有三個(gè)參數(shù),(a)原始樹進(jìn)行區(qū)分,(b)新的樹結(jié)果,(c)目標(biāo)Subversion存儲(chǔ)庫的URL。如果您正在使用git svn
-aware存儲(chǔ)庫(已init
與之配合使用git svn
),則可以省略最后一個(gè)參數(shù)(URL )。這需要-r <revision>選項(xiàng)。
當(dāng)?shù)诙€(gè) tree-ish 表示這樣一個(gè)對(duì)象,或者通過調(diào)用一個(gè)編輯器(請(qǐng)參閱下面的選項(xiàng))請(qǐng)求時(shí),提交消息直接提供給-m
or -F
選項(xiàng),或者間接來自標(biāo)記或提交--edit
。
-m <msg> --message=<msg>
使用給定msg
的提交消息。該選項(xiàng)禁用該--edit
選項(xiàng)。
-F <filename> --file=<filename>
從給定的文件中獲取提交消息。該選項(xiàng)禁用該--edit
選項(xiàng)。
info
顯示有關(guān)類似'svn info'提供的文件或目錄的信息。目前不支持-r / - 修訂參數(shù)。使用--url選項(xiàng)僅輸出URL:
字段的值。
proplist
列出存儲(chǔ)在Subversion存儲(chǔ)庫中關(guān)于給定文件或目錄的屬性。使用-r / - revision來引用特定的Subversion版本。
propget
獲取作為第一個(gè)參數(shù)給定的Subversion屬性,用于文件??梢允褂?r / - revision指定特定的修訂版本。
propset
將作為第一個(gè)參數(shù)給出的Subversion屬性設(shè)置為作為第三個(gè)參數(shù)給出的文件的第二個(gè)參數(shù)給出的值。
例子:
git svn propset svn:keywords "FreeBSD=%H" devel/py-tipper/Makefile
這將屬性設(shè)置svn:keywords
到FreeBSD=%H
該文件devel/py-tipper/Makefile
。
show-externals
顯示Subversion外部。使用-r / - revision來指定特定的修訂版本。
gc
壓縮$ GIT_DIR / svn / <refname> /unhandled.log文件并刪除$ GIT_DIR / svn / <refname> / index文件。
reset
取消fetch
返回指定修訂的效果。這使您可以重新fetch
修訂SVN。通常情況下,SVN修訂版的內(nèi)容不應(yīng)該改變,reset
不應(yīng)該有必要。但是,如果SVN權(quán)限發(fā)生變化,或者如果您更改了--ignore-paths選項(xiàng),a fetch
可能會(huì)因“未在提交中找到”(文件先前不可見)或“校驗(yàn)和不匹配”(錯(cuò)過修改)而失敗。如果問題文件永遠(yuǎn)不能被忽略(使用--ignore-paths),修復(fù)repo的唯一方法就是使用reset
。
只有rev_map和refs / remotes / git-svn被更改(請(qǐng)參閱$GIT_DIR/svn/*\*/.rev_map.*
下面的FILES部分了解詳細(xì)信息)。跟隨reset
一個(gè)fetch
然后git reset
或git rebase
移動(dòng)當(dāng)?shù)胤种У叫碌臉渖稀?/p>
-r <n> --revision=<n>
指定要保留的最新版本。以后的所有修訂都會(huì)被丟棄。
-p --parent
同樣放棄指定的修訂版本,而是保留最近的父版本。
例子:
假設(shè)您在“主”中進(jìn)行了本地更改,但您需要重新提取“r2”。
r1---r2---r3 remotes/git-svn \ A---B master
修復(fù)首先導(dǎo)致“r2”不完整的忽略路徑或SVN權(quán)限問題。然后:
git svn reset -r2 -p git svn fetch
r1---r2'--r3' remotes/git-svn \ r2---r3---A---B master
然后修正“主”與git rebase
。不要使用git merge
或您的歷史將與未來不兼容dcommit
!
git rebase --onto remotes/git-svn A^ master
r1---r2'--r3' remotes/git-svn \ A'--B' master
--shared=(false|true|umask|group|all|world|everybody) --template=<template_directory>
僅用于該init
命令。這些直接傳遞給git init
。
-r <arg> --revision <arg>
與fetch
命令一起使用。
這允許支持部分/燒灼歷史的修訂范圍。$ NUMBER,$ NUMBER1:$ NUMBER2(數(shù)值范圍),$ NUMBER:HEAD和BASE:$ NUMBER都支持。
這可以使您在運(yùn)行提取時(shí)創(chuàng)建部分鏡像; 但通常不推薦使用,因?yàn)闅v史記錄會(huì)被跳過并丟失。
--stdin
僅用于該set-tree
命令。
從stdin中讀取提交列表并按相反順序提交它們。只有領(lǐng)先的sha1從每行讀取,因此git rev-list --pretty=oneline
可以使用輸出。
--rmdir
只有用過的dcommit
,set-tree
和commit-diff
命令。
如果沒有文件留下,請(qǐng)從SVN樹中刪除目錄。SVN可以對(duì)空目錄進(jìn)行版本化,并且如果沒有剩下文件,它們不會(huì)被默認(rèn)刪除。Git不能版本空目錄。啟用此標(biāo)志將使SVN的行為像Git一樣行事。
config key: svn.rmdir
-e --edit
只有用過的dcommit
,set-tree
和commit-diff
命令。
在提交SVN之前編輯提交消息。默認(rèn)情況下,對(duì)于提交的對(duì)象是關(guān)閉的,并且在提交樹對(duì)象時(shí)被強(qiáng)制關(guān)閉。
config key: svn.edit
-l<num> --find-copies-harder
只有用過的dcommit
,set-tree
和commit-diff
命令。
他們都直接傳遞給git diff-tree
; 有關(guān)更多信息,請(qǐng)參閱git-diff-tree [1]。
config key: svn.l config key: svn.findcopiesharder
-A<filename> --authors-file=<filename>
語法與下列使用的文件兼容git cvsimport
:
loginname = Joe User <user@example.com>
如果指定了此選項(xiàng)并git svn
遇到作者文件中不存在的SVN提交者名稱,git svn
則會(huì)中止操作。用戶將不得不添加適當(dāng)?shù)臈l目。git svn
作者文件被修改后重新運(yùn)行前面的命令應(yīng)該繼續(xù)運(yùn)行。
config key: svn.authorsfile
--authors-prog=<filename>
如果指定了此選項(xiàng),則對(duì)于作者文件中不存在的每個(gè)SVN提交者名稱,將使用提交者名稱作為第一個(gè)參數(shù)來執(zhí)行給定文件。該程序預(yù)計(jì)會(huì)返回一個(gè)形式為“Name <email>”的單行,該行將被視為包含在作者文件中。
config key: svn.authorsProg
-q --quiet
讓git svn
更簡(jiǎn)潔。再指定一次,使其更加冗長。
-m --merge -s<strategy> --strategy=<strategy> -p --preserve-merges
這些僅用于dcommit
和rebase
命令。
如果a 不能使用,請(qǐng)直接轉(zhuǎn)至git rebase
使用時(shí)間(請(qǐng)參閱)。dcommitgit resetdcommit
-n --dry-run
這可以通過使用dcommit
,rebase
,branch
和tag
命令。
對(duì)于dcommit
,打印出一系列Git參數(shù),這些參數(shù)將顯示哪些差異將提交給SVN。
對(duì)于rebase
顯示與當(dāng)前分支關(guān)聯(lián)的上游svn存儲(chǔ)庫相關(guān)聯(lián)的本地分支以及將從中獲取的svn存儲(chǔ)庫的URL。
對(duì)于branch
和tag
,在創(chuàng)建分支或標(biāo)記時(shí)顯示將用于復(fù)制的URL。
--use-log-author
當(dāng)檢索SVN提交到Git的(作為的一部分fetch
,rebase
或者dcommit
操作),找第一From:
或Signed-off-by:
日志消息行和使用,作為作者的字符串。
config key: svn.useLogAuthor
--add-author-from
當(dāng)承諾的SVN混帳(作為的一部分commit-diff
,set-tree
或者dcommit
操作),如果現(xiàn)有的日志消息不已經(jīng)有一個(gè)From:
或Signed-off-by:
行,追加一個(gè)From:
基于Git的行提交的作者字符串。如果你使用這個(gè),那么--use-log-author
將為所有提交檢索一個(gè)有效的作者字符串。
config key: svn.addAuthorFrom
-i<GIT_SVN_ID> --id <GIT_SVN_ID>
這設(shè)置GIT_SVN_ID(而不是使用環(huán)境)。這允許用戶覆蓋默認(rèn)的refname以在跟蹤單個(gè)URL時(shí)獲取。的log
和dcommit
命令不再需要此開關(guān)作為參數(shù)。
-R<remote name> --svn-remote <remote name>
指定要使用的svn-remote“<remote name>”部分,這允許SVN多個(gè)存儲(chǔ)庫被跟蹤。默認(rèn)值:“svn”
--follow-parent
如果我們跟蹤分支(使用存儲(chǔ)庫布局選項(xiàng)之一--trunk,--tags, - branch,--stdlayout),此選項(xiàng)才相關(guān)。對(duì)于每個(gè)追蹤分支,嘗試找出其修訂版本從哪里復(fù)制而來,并在分支的第一個(gè)Git提交中設(shè)置合適的父代。當(dāng)我們跟蹤已在存儲(chǔ)庫中移動(dòng)的目錄時(shí),這非常有用。如果此功能被禁用,則由所創(chuàng)建的分支git svn
將全部為線性,并且不共享任何歷史記錄,這意味著將不會(huì)有關(guān)于分支分支或合并的信息。但是,長時(shí)間/復(fù)雜的歷史記錄可能需要很長時(shí)間,因此禁用此功能可能會(huì)加速克隆過程。此功能默認(rèn)啟用,請(qǐng)使用--no-follow-parent將其禁用。
config key: svn.followparent
svn.noMetadata svn-remote.<name>.noMetadata
這可以git-svn-id:
在每次提交結(jié)束時(shí)刪除這些行。
此選項(xiàng)只能用于一次導(dǎo)入,因?yàn)?code>git svn如果沒有元數(shù)據(jù),將無法再次獲取。此外,如果您丟失了$GIT_DIR/svn/*\*/.rev_map.*
文件,git svn
將無法重建它們。
這個(gè)git svn log
命令也不會(huì)在使用它的存儲(chǔ)庫上工作。這與使用useSvmProps
(希望)顯而易見的原因相矛盾。
不推薦使用此選項(xiàng),因?yàn)檫@會(huì)導(dǎo)致難以在現(xiàn)有文檔,錯(cuò)誤報(bào)告和歸檔中追蹤對(duì)SVN修訂號(hào)的舊引用。如果你打算最終從SVN遷移到Git,并確定要?jiǎng)h除SVN歷史記錄,請(qǐng)考慮使用git-filter-branch [1]。filter-branch還允許重新格式化元數(shù)據(jù),以便讀取和重寫非“svn.authorsFile”用戶的作者信息。
svn.useSvmProps svn-remote.<name>.useSvmProps
這允許git svn
從使用SVN :: Mirror(或svk)為元數(shù)據(jù)創(chuàng)建的鏡像中重新映射存儲(chǔ)庫URL和UUID。
如果一個(gè)SVN修訂版有一個(gè)屬性“svm:headrev”,那么修改可能是由SVN :: Mirror(也被SVK使用)創(chuàng)建的。該屬性包含存儲(chǔ)庫UUID和修訂版。我們希望使它看起來像我們鏡像原始URL,因此引入一個(gè)幫助函數(shù),該函數(shù)返回原始標(biāo)識(shí)URL和UUID,并在提交消息中生成元數(shù)據(jù)時(shí)使用它。
svn.useSvnsyncProps svn-remote.<name>.useSvnsyncprops
類似于useSvmProps選項(xiàng); 這是針對(duì)隨SVN 1.4.x及更高版本分發(fā)的svnsync(1)命令的用戶。
svn-remote.<name>.rewriteRoot
這允許用戶從備用URL創(chuàng)建存儲(chǔ)庫。例如,管理員可以git svn
在本地運(yùn)行服務(wù)器(通過file://訪問),但希望在元數(shù)據(jù)中使用公共http://或svn:// URL分發(fā)存儲(chǔ)庫,以便用戶可以看到公共URL 。
svn-remote.<name>.rewriteUUID
類似于useSvmProps選項(xiàng); 這適用于需要手動(dòng)重新映射UUID的用戶。在原始UUID無法通過useSvmProps或useSvnsyncProps獲得的情況下,這可能會(huì)很有用。
svn-remote.<name>.pushurl
與Git類似remote.<name>.pushurl
,此密鑰旨在用于url
通過只讀傳輸指向SVN存儲(chǔ)庫以提供備用讀/寫傳輸?shù)那闆r。假定兩個(gè)鍵都指向同一個(gè)存儲(chǔ)庫。不像commiturl
,pushurl
是一個(gè)基本路徑。如果使用commiturl
或pushurl
可以使用,commiturl
則優(yōu)先。
svn.brokenSymlinkWorkaround
這將禁用潛在的昂貴檢查來解決由破碎的客戶端檢入到SVN中的損壞的符號(hào)鏈接。如果您跟蹤具有許多空符號(hào)鏈接的SVN存儲(chǔ)庫,請(qǐng)將此選項(xiàng)設(shè)置為“false”。該選項(xiàng)可以在git svn
運(yùn)行時(shí)更改,并在下一個(gè)修訂版本生效。如果未設(shè)置,則git svn
假定此選項(xiàng)為“true”。
svn.pathnameencoding
這指示git svn重新編碼給定編碼的路徑名。它可以被Windows用戶和非UTF8語言環(huán)境中的用戶使用,以避免使用非ASCII字符損壞的文件名。有效的編碼是Perl的Encode模塊支持的編碼。
svn-remote.<name>.automkdirs
通常,“git svn clone”和“git svn rebase”命令會(huì)嘗試重新創(chuàng)建Subversion存儲(chǔ)庫中的空目錄。如果此選項(xiàng)設(shè)置為“false”,則只有在顯式運(yùn)行“git svn mkdirs”命令時(shí)才會(huì)創(chuàng)建空目錄。如果未設(shè)置,則git svn
假定此選項(xiàng)為“true”。
由于noMetadata,rewriteRoot,rewriteUUID,useSvnsyncProps和useSvmProps選項(xiàng)都會(huì)影響生成和使用的元數(shù)據(jù)git svn
; 它們必須在導(dǎo)入任何歷史記錄之前在配置文件中設(shè)置,并且這些設(shè)置一旦設(shè)置就不會(huì)被更改。
此外,每個(gè)svn-remote部分只能使用其中一個(gè)選項(xiàng),因?yàn)樗鼈儠?huì)影響git-svn-id:
元數(shù)據(jù)行,但可以一起使用的rewriteRoot和rewriteUUID除外。
跟蹤和貢獻(xiàn)Subversion管理項(xiàng)目的主干(忽略標(biāo)簽和分支):
# 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
跟蹤和貢獻(xiàn)整個(gè)Subversion管理的項(xiàng)目(包含干線,標(biāo)簽和分支):
# 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
可能非常耗時(shí)(尤其是對(duì)于大型的Subversion版本庫)。如果多個(gè)人(或多個(gè)機(jī)器的一個(gè)人)想要用于git svn
與同一Subversion存儲(chǔ)庫進(jìn)行交互,則可以將初始信息git svn clone
寫入服務(wù)器上的存儲(chǔ)庫,并讓每個(gè)人都使用以下內(nèi)容克隆該存儲(chǔ)庫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
喜歡使用git svn rebase
或git rebase
,而不是git pull
或git merge
以非整合的提交與同步git svn
分支。這樣做會(huì)使未集成的提交歷史與上游SVN存儲(chǔ)庫保持線性關(guān)系,并允許使用首選的git svn dcommit
子命令將未集成的提交推回到SVN中。
最初,git svn
建議開發(fā)商從git svn
分支機(jī)構(gòu)撤出或合并。這是因?yàn)樽髡邇A向于git svn set-tree B
提交一個(gè)單獨(dú)的頭部而不是git svn set-tree A..B
標(biāo)記來提交多個(gè)提交。使用git pull
或git merge
使用git svn set-tree A..B
會(huì)導(dǎo)致觸犯到SVN時(shí)被壓扁的非線性歷史,這可能導(dǎo)致合并提交意外扭轉(zhuǎn)了以前的SVN提交。
雖然git svn
可以追蹤采用標(biāo)準(zhǔn)布局的存儲(chǔ)庫的復(fù)制歷史記錄(包括分支和標(biāo)簽),但它還不能代表SVT用戶在git上游發(fā)生的合并歷史記錄。因此,建議用戶在Git中保持歷史盡可能線性,以便與SVN兼容(請(qǐng)參閱下面的CAVEATS部分)。
如果git svn
配置為獲取分支(并且--follow分支有效),它有時(shí)會(huì)為一個(gè)SVN分支創(chuàng)建多個(gè)Git分支,其中附加分支具有表單名稱branchname@nnn
(其中nnn為SVN修訂版號(hào))。如果git svn
在SVN分支中找不到第一次提交的父提交,則將創(chuàng)建這些附加分支,以將分支連接到其他分支的歷史記錄。
通常情況下,SVN分支中的第一次提交由復(fù)制操作組成。git svn
將讀取此提交以獲取分支創(chuàng)建的SVN修訂。然后它將嘗試找到與此SVN修訂版相對(duì)應(yīng)的Git提交,并將其用作分支的父代。但是,有可能沒有合適的Git提交作為父代。除此之外,如果SVN分支是未被獲取的修訂副本git svn
(例如,因?yàn)樗桥f版本而被跳過--revision
),或者在SVN中復(fù)制的目錄未被跟蹤git svn
(比如根本沒有跟蹤的分支,或者被跟蹤分支的子目錄)。在這些情況下,git svn
仍然會(huì)創(chuàng)建一個(gè)Git分支,但不是使用現(xiàn)有的Git提交作為分支的父代,它會(huì)讀取分支復(fù)制的目錄的SVN歷史記錄,并創(chuàng)建適當(dāng)?shù)腉it提交。這由消息“Initializing parent:<branchname>”表示。
另外,它會(huì)創(chuàng)建一個(gè)名為特殊分支<branchname>@<SVN-Revision>
,其中<SVN-Revision>是該分支從其復(fù)制的SVN修訂號(hào)。這個(gè)分支將指向分支的新創(chuàng)建的父提交。如果在SVN中該分支已被刪除,并稍后從不同版本重新創(chuàng)建,則會(huì)有多個(gè)這樣的分支@
。
請(qǐng)注意,這可能意味著為單個(gè)SVN修訂版創(chuàng)建了多個(gè)Git提交。
一個(gè)例子:在一個(gè)具有標(biāo)準(zhǔn)trunk / tags / branches布局的SVN倉庫中,在r.100中創(chuàng)建一個(gè)目錄trunk / sub。在r.200中,trunk / sub通過將其復(fù)制到分支/來進(jìn)行分支。git svn clone -s
然后將創(chuàng)建一個(gè)分支sub
。它還將為r.100到r.199創(chuàng)建新的Git提交并將其用作分支的歷史記錄sub
。因此,從r.100到r.199的每個(gè)修訂將有兩個(gè)Git提交(其中一個(gè)包含trunk /,一個(gè)包含trunk / sub /)。最后,它會(huì)創(chuàng)建一個(gè)分支,sub@200
指向分支的新的父提交sub
(即提交r.200和trunk / sub /)。
為簡(jiǎn)單起見,并與Subversion互操作,則建議所有git svn
用戶克隆,提取和dcommit直接從SVN服務(wù)器,并避免所有git clone
/ pull
/ merge
/ push
Git存儲(chǔ)區(qū)和支路之間的操作。GIT中分支和用戶之間交換代碼的推薦的方法是git format-patch
和git am
,或只是“dcommit'ing至SVN庫。
正在運(yùn)行git merge
或git pull
不建議您計(jì)劃dcommit
從分支機(jī)構(gòu)運(yùn)行,因?yàn)镾ubversion用戶無法看到您所做的任何合并。此外,如果您從SVN分支的鏡像Git分支合并或拉出,dcommit
可能會(huì)提交到錯(cuò)誤的分支。
如果您合并,請(qǐng)注意以下規(guī)則:git svn dcommit
將嘗試提交在名為in的SVN提交之上
git log --grep=^git-svn-id: --first-parent -1
must
因此,您確保您想要提交的分支的最近提交是first
合并的父代。否則就會(huì)出現(xiàn)混亂,尤其是如果第一個(gè)父代在同一個(gè)SVN分支上是較舊的提交。
git clone
不會(huì)在refs / remotes /層次結(jié)構(gòu)或任何git svn
元數(shù)據(jù)或配置下克隆分支。因此,如果要完成克隆,使用創(chuàng)建和管理的存儲(chǔ)庫git svn
應(yīng)該rsync
用于克隆。
由于dcommit
內(nèi)部使用重訂,任何的Git分支您git push
之前dcommit
就需要迫使現(xiàn)有裁判的覆蓋上的遠(yuǎn)程存儲(chǔ)庫。這通常被認(rèn)為是不好的做法,詳情請(qǐng)參閱git-push [1]文檔。
不要在您已經(jīng)提交的更改中使用git-commit [1]的--amend選項(xiàng)。對(duì)于已經(jīng)推送到其他用戶的遠(yuǎn)程存儲(chǔ)庫的驗(yàn)證提交被認(rèn)為是不好的做法,而使用SVN的dcommit與此類似。
克隆SVN倉庫時(shí),如果沒有使用描述倉庫布局的選項(xiàng)(--trunk,--tags, - branch,--stdlayout),git svn clone
將創(chuàng)建一個(gè)完全線性歷史記錄的Git倉庫,其中分支和標(biāo)簽在工作副本中顯示為單獨(dú)的目錄。雖然這是獲取完整存儲(chǔ)庫副本的最簡(jiǎn)單方法,但對(duì)于擁有多個(gè)分支的項(xiàng)目,它將導(dǎo)致工作副本比主干大很多倍。因此,對(duì)于使用標(biāo)準(zhǔn)目錄結(jié)構(gòu)(中繼/分支/標(biāo)簽)的項(xiàng)目,建議使用選項(xiàng)進(jìn)行克隆--stdlayout
。如果項(xiàng)目使用非標(biāo)準(zhǔn)結(jié)構(gòu),并且/或者不需要分支和標(biāo)簽,則只需克隆一個(gè)目錄(通常為主干)即可,而無需提供任何存儲(chǔ)庫布局選項(xiàng)。如果需要帶分支和標(biāo)簽的完整歷史記錄,則必須使用選項(xiàng)--trunk
/ --branches
/ --tags
。
當(dāng)使用多分支或 - 標(biāo)簽時(shí),git svn
不會(huì)自動(dòng)處理名稱沖突(例如,如果來自不同路徑的兩個(gè)分支具有相同名稱,或者分支和標(biāo)簽具有相同名稱)。在這些情況下,使用init
設(shè)置您的Git存儲(chǔ)庫,然后在第一次之前fetch
編輯$ GIT_DIR / config文件,以便分支和標(biāo)簽與不同的名稱空間相關(guān)聯(lián)。例如:
branches = stable/*:refs/remotes/svn/stable/* branches = debug/*:refs/remotes/svn/debug/*
我們忽略除svn:executable之外的所有SVN屬性。任何未處理的屬性都會(huì)記錄到$ GIT_DIR / svn / <refname> /unhandled.log
重命名和復(fù)制的目錄不會(huì)被Git檢測(cè)到,因此在提交SVN時(shí)不會(huì)被跟蹤。我不打算增加對(duì)此的支持,因?yàn)闉樗锌赡艿慕锹浒咐ぷ魇欠浅@щy和耗時(shí)的(Git也沒有這樣做)。完全支持提交重命名和復(fù)制的文件,只要它們足夠類似于Git來檢測(cè)它們即可。
在SVN中,可以(雖然不鼓勵(lì))對(duì)標(biāo)簽提交更改(因?yàn)闃?biāo)簽只是目錄副本,因此在技術(shù)上與分支相同)??寺VN存儲(chǔ)庫時(shí),git svn
不知道將來是否會(huì)對(duì)此標(biāo)簽進(jìn)行提交。因此,它保守地行事,并將所有SVN標(biāo)簽作為分支導(dǎo)入,以標(biāo)簽名稱作為前綴tags/
。
git svn
將svn-remote配置信息存儲(chǔ)在存儲(chǔ)庫$ GIT_DIR / config文件中。它類似于核心的Git遠(yuǎn)程部分,但fetch
鍵不接受glob參數(shù); 但它們是由branches
和tags
鍵來處理的。由于一些SVN存儲(chǔ)庫奇怪地配置了多個(gè)項(xiàng)目glob擴(kuò)展,允許使用下面列出的項(xiàng)目:
[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/*
請(qǐng)記住,*
本地引用(:
*)右邊的(星號(hào))通配符必須是最右邊的正確路徑組件; 但是,只要遠(yuǎn)程通配符是獨(dú)立路徑組件(由/
EOL 包圍),遠(yuǎn)程通配符就可以在任何地方。這種類型的配置不會(huì)自動(dòng)創(chuàng)建init
,應(yīng)該使用文本編輯器或使用手動(dòng)輸入git config
。
另請(qǐng)注意,每個(gè)單詞只允許使用一個(gè)星號(hào)。例如:
branches = branches/re*se:refs/remotes/project-a/branches/*
將匹配樹枝release
,rese
,re123se
然而,
branches = branches/re*s*e:refs/remotes/project-a/branches/*
會(huì)產(chǎn)生一個(gè)錯(cuò)誤。
也可以通過在大括號(hào)中使用逗號(hào)分隔的名稱列表來獲取分支或標(biāo)簽的子集。例如:
[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/*
支持多個(gè)提取,分支和標(biāo)簽密鑰:
[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/*
在這種配置中創(chuàng)建分支需要使用-d或--destination標(biāo)志來消除使用哪個(gè)位置:
$ git svn branch -d branches/server release-2-3-0
請(qǐng)注意,git-svn會(huì)跟蹤出現(xiàn)分支或標(biāo)記的最高版本。如果分支或標(biāo)簽的子集在獲取后發(fā)生更改,則必須手動(dòng)編輯$ GIT_DIR / svn / .metadata以根據(jù)需要?jiǎng)h除(或重置)分支-maxRev和/或tags-maxRev。
$GIT_DIR/svn/*\*/.rev_map.*
Subversion版本號(hào)和Git提交名之間的映射。在沒有設(shè)置noMetadata選項(xiàng)的存儲(chǔ)庫中,可以從每次提交結(jié)束時(shí)的git-svn-id:行重新創(chuàng)建(參見svn.noMetadata
上面的細(xì)節(jié)部分)。
git svn fetch
并git svn rebase
自動(dòng)更新rev_map,如果它丟失或不是最新的。git svn reset
自動(dòng)倒帶它。