亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

directory search
Guides gitattributes giteveryday gitglossary gitignore gitmodules gitrevisions gittutorial gitworkflows Administration git archive git bundle git clean git filter-branch git fsck git gc git instaweb git reflog Basic Snapshotting git add git commit git diff git mv git reset git rm git status Branching and Merging git branch git checkout git log git merge git mergetool git stash git tag Debugging git bisect git blame git grep Email git am git format-patch git request-pull git send-email External Systems git fast-import git svn Getting and Creating Projects git clone git init Git git annotate git archimport git bisect-lk2009 git check-attr git check-mailmap git check-ref-format git checkout-index git cherry git citool git column git credential git credential-cache git credential-store git cvsexportcommit git cvsimport git cvsserver git diff-files git diff-tree git difftool git fast-export git fetch-pack git fmt-merge-msg git get-tar-commit-id git gui git http-backend git http-fetch git http-push git imap-send git index-pack git interpret-trailers git ls-remote git ls-tree git mailinfo git mailsplit git merge-file git merge-index git merge-one-file git merge-tree git mktag git mktree git name-rev git notes git p4 git pack-objects git pack-redundant git pack-refs git parse-remote git patch-id git prune git prune-packed git quiltimport git receive-pack git remote-ext git remote-fd git remote-testgit git repack git replace git rerere git send-pack git sh-i18n git sh-setup git shell git show-branch git show-index git stripspace git unpack-file git unpack-objects git upload-archive git upload-pack git var git verify-commit git verify-tag git whatchanged git worktree Inspection and Comparison git describe git shortlog git show Miscellaneous api credentials api index gitcli gitcore tutorial gitcredentials gitcvs migration gitdiffcore githooks gitk gitnamespaces gitremote helpers gitrepository layout gitsubmodules gittutorial 2 gitweb gitweb.conf pack format User Manual Patching git apply git cherry-pick git rebase git revert Plumbing Commands git cat-file git check-ignore 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 Server Admin git daemon git update-server-info Setup and Config git git config git help Sharing and Updating Projects git fetch git pull git push git remote git submodule
characters

命名

git-svn  -  Subversion版本庫和Git之間的雙向操作

概要

git svn <command> [options] [arguments]

描述

git svn是Subversion和Git之間變更集的簡單渠道。它提供了Subversion和Git存儲庫之間的雙向變化流。

git svn可以跟蹤常見的“trunk / branches / tags”布局,并使用--stdlayout選項來跟蹤標準的Subversion存儲庫。它也可以使用-T / -t / -b選項在任何布局中跟隨分支和標簽(請參閱init下面的選項以及clone命令)。

一旦跟蹤Subversion存儲庫(使用上述任何方法),可以通過fetch命令從Subversion更新Git存儲庫,并通過命令從Git更新Subversion dcommit。

命令

init

使用其他元數(shù)據(jù)目錄初始化一個空的Git存儲庫git svn??梢詫ubversion URL指定為命令行參數(shù),或者將其指定為-T / -t / -b的完整URL參數(shù)?;蛘?,可以將要操作的目標目錄指定為第二個參數(shù)。通常這個命令初始化當前目錄。

-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)。您可以指定多個--tags和/或--branches選項,以防Subversion存儲庫將標簽或分支置于多個路徑下。選項--stdlayout是將trunk,tags,branches設置為相對路徑的簡寫方式,這是Subversion的默認設置。如果還有其他任何選項,則優(yōu)先。

--no-metadata

noMetadata在svn-remote配置中設置選項。不建議svn.noMetadata使用此選項,請在使用此選項之前閱讀該手冊頁的部分。

--use-svm-props

useSvmProps在svn-remote配置中設置選項。

--use-svnsync-props

useSvnsyncProps在svn-remote配置中設置選項。

--rewrite-root=<URL>

rewriteRoot在svn-remote配置中設置選項。

--rewrite-uuid=<UUID>

rewriteUUID在svn-remote配置中設置選項。

--username=<user>

對于SVN處理(http,https和普通svn)身份驗證的傳輸,請指定用戶名。對于其他傳輸(例如svn+ssh://),您必須在URL中包含用戶名,例如svn+ssh://foo@svn.bar.com/project

--prefix=<prefix>

如果指定了trunk / branches / tags,這允許指定一個前綴作為遠程名稱的前綴。前綴不會自動包含結(jié)尾的斜杠,因此如果這是您想要的,請確保在參數(shù)中包含一個。如果指定了--branches / -b,則前綴必須包含尾部斜線。在任何情況下都強烈建議設置前綴(使用尾部斜線),因為您的SVN跟蹤引用將位于“refs / remotes / $ prefix / ”,這與Git自己的遠程跟蹤引用布局兼容(參考文獻/遠程/ $遠程/)。如果您希望跟蹤共享公共存儲庫的多個項目,那么設置前綴也很有用。默認情況下,前綴設置為origin/。

注意

在Git v2.0之前,默認的前綴是“”(無前綴)。這意味著SVN跟蹤文件被放在“refs / remotes / *”,這與Git自己的遠程跟蹤文件的組織方式不兼容。如果你仍然想要舊的默認值,可以通過在命令行上傳遞--prefix“”來獲得它(如果你的Perl的Getopt :: Long是<v2.37,那么--prefix =“”可能不起作用)。

--ignore-refs=<regex>

當傳遞給initclone正則表達式將被保存為配置密鑰。請參閱fetch有關(guān)說明--ignore-refs。

--ignore-paths=<regex>

當傳遞給initclone正則表達式將被保存為配置密鑰。請參閱fetch有關(guān)說明--ignore-paths

--include-paths=<regex>

當傳遞給initclone正則表達式將被保存為配置密鑰。請參閱fetch有關(guān)說明--include-paths。

--no-minimize-url

當跟蹤多個目錄(使用--stdlayout, -  branch或-tags選項)時,git svn將嘗試連接到Subversion存儲庫的根(或最高允許級別)。如果整個項目在存儲庫中移動,則此默認值允許更好地跟蹤歷史記錄,但可能會導致存在讀取訪問限制的存儲庫中出現(xiàn)問題。傳遞--no-minimize-url將允許git svn按原樣接受URL,而不嘗試連接到更高級別的目錄。當只有一個URL /分支被跟蹤時,這個選項默認是關(guān)閉的(它不會有什么好處)。

fetch

從我們正在跟蹤的Subversion遠程獲取未提取的修訂。$ GIT_DIR / config文件中的svn-remote“...”部分的名稱可以指定為可選的命令行參數(shù)。

如果需要,這會自動更新rev_map($GIT_DIR/svn/*\*/.rev_map.*有關(guān)詳細信息,請參閱下面的FILES部分)。

--localtime

將Git提交時間存儲在本地時區(qū)而不是UTC。這使得git log(甚至沒有--date = local)顯示與svn log當?shù)貢r區(qū)相同的時間。

這并不妨礙與克隆的Subversion版本庫的互操作,但如果您希望本地Git存儲庫能夠與其他人的本地Git存儲庫互操作,則不要使用此選項,或者您都應該使用它相同的當?shù)貢r區(qū)。

--parent

僅從當前HEAD的SVN父節(jié)點獲取。

--ignore-refs=<regex>

忽略與Perl正則表達式匹配的分支或標記的引用?!柏撁骖A測斷言” ^refs/remotes/origin/(?!tags/wanted-tag|wanted-branch).*$可以用來僅允許某些參考。

config key: svn-remote.<name>.ignore-refs

如果ignore-refs配置鍵已設置,并且還提供了命令行選項,則將使用這兩個正則表達式。

--ignore-paths=<regex>

這允許指定一個Perl正則表達式,這會導致SVN從結(jié)帳中跳過所有匹配的路徑。該--ignore-paths選項應與每一個fetch(包括自動取因clone,dcommitrebase,等)在給定的存儲庫。

config key: svn-remote.<name>.ignore-paths

如果設置了ignore-paths配置鍵,并且還給出了命令行選項,則將使用這兩個正則表達式。

例子:

每次抓取跳過“doc *”目錄

--ignore-paths="^doc"

跳過第一級目錄的“分支”和“標簽”

--ignore-paths="^[^/]+/(?:branches|tags)"

--include-paths=<regex>

這樣可以指定一個Perl正則表達式,這會導致只包含從SVN簽出的匹配路徑。該--include-paths選項應與每一個fetch(包括自動取因clone,dcommit,rebase,等)在給定的存儲庫。--ignore-paths優(yōu)先--include-paths。

config key: svn-remote.<name>.include-paths

--log-window-size=<n>

掃描Subversion歷史記錄時,每個請求獲取<n>日志條目。默認值為100對于非常大的Subversion資料庫中,可能需要較大的值clone/ fetch在合理的時間內(nèi)完成。但過大的值可能會導致更高的內(nèi)存使用量和請求超時。

clone

運行initfetch。它會根據(jù)傳遞給它的URL的基名自動創(chuàng)建一個目錄; 或者是否傳遞了第二個參數(shù); 它會創(chuàng)建一個目錄并在其中工作。它接受initfetch命令接受的所有參數(shù); 除了--fetch-all--parent。克隆存儲庫后,該fetch命令將能夠更新修訂版而不影響工作樹; 并且該rebase命令將能夠使用最新更改更新工作樹。

--preserve-empty-dirs

在本地Git存儲庫中為從Subversion提取的每個空目錄創(chuàng)建一個占位符文件。這包括通過刪除Subversion存儲庫中的所有條目(但不包括目錄本身)而變空的目錄。當不再需要時,占位符文件也被跟蹤和刪除。

--placeholder-filename=<filename>

設置由--preserve-empty-dirs創(chuàng)建的占位符文件的名稱。默認:“.gitignore”

rebase

這會從當前HEAD的SVN父節(jié)點獲取修訂,并將當前(未提交到SVN)的工作重新綁定到它。

這與其相似svn updategit pull除了它保留了線性歷史記錄git rebase而不是git merge為了方便提交git svn。

這接受所有選項git svn fetchgit rebase接受。但是,--fetch-all只能從當前的svn-remote中獲取,而不是所有的svn-remote定義。

git rebase; 這要求工作樹干凈并且沒有未提交的更改。

如果需要,這會自動更新rev_map($GIT_DIR/svn/*\*/.rev_map.*有關(guān)詳細信息,請參閱下面的FILES部分)。

-l   --local

不要遠程獲取; 僅git rebase針對上游SVN上次提交的提交運行。

dcommit

將當前分支中的每個diff直接提交到SVN存儲庫,然后重新綁定或重置(取決于SVN和head之間是否存在差異)。這將在Git中為每個提交創(chuàng)建SVN修訂。

當一個可選的Git分支名稱(或Git提交對象名稱)被指定為參數(shù)時,子命令在指定的分支上工作,而不是在當前分支上。

使用dcommit優(yōu)于set-tree(下面)。

--no-rebase

提交后,不要重新設置或重置。

--commit-url <URL>

提交到這個SVN URL(完整路徑)。這樣做的目的在于,如果稍后用戶可以訪問替代傳輸方法(例如或)來提交,那么允許git svn使用一種傳輸方法(例如svn://http://用于匿名讀?。﹦?chuàng)建的現(xiàn)有存儲庫被重用。svn+ssh://https://

config key: svn-remote.<name>.commiturl
config key: svn.commiturl (overwrites all svn-remote.<name>.commiturl options)

請注意,commiturl config密鑰的SVN URL包含SVN分支。如果您想為整個SVN存儲庫設置提交URL,請改為使用svn-remote。<name> .pushurl。

使用這個選項用于任何其他目的(不要問)非常不鼓勵。

--mergeinfo=<mergeinfo>

在dcommit(eg --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屬性。目前,只有在提交非快進合并的情況下,只有第一個父母已經(jīng)被推入SVN的情況下才能完成此操作。

--interactive

要求用戶確認補丁集應該實際發(fā)送給SVN。對于每個補丁,可以回答“是”(接受此補?。?,“否”(丟棄此補?。叭俊保ń邮芩醒a?。┗颉巴顺觥?。

git svn dcommit 如果回答為“否”或“退出”,則立即返回,但不向SVN提交任何內(nèi)容。

branch

在SVN存儲庫中創(chuàng)建一個分支。

-m   --message

允許指定提交消息。

-t   --tag

通過使用tags_subdir而不是在git svn init期間指定的branches_subdir創(chuàng)建一個標簽。

-d<path>   --destination=<path>

如果給initor clone命令提供了多個--branches(或--tags)選項,則必須提供您希望在SVN存儲庫中創(chuàng)建的分支(或標簽)的位置。<path>指定用于創(chuàng)建分支或標記的路徑,并且應該與其中一個配置的分支或標記refspecs的左側(cè)的模式相匹配。您可以使用這些命令查看這些refspecs

git config --get-all svn-remote.<name>.branches
git config --get-all svn-remote.<name>.tags

其中<name>是由-R選項init(默認情況下為“svn”)指定的SVN存儲庫的名稱。

--username

指定SVN用戶名以執(zhí)行提交。該選項覆蓋username配置屬性。

--commit-url

使用指定的URL連接到目標Subversion存儲庫。這在源SVN存儲庫為只讀的情況下非常有用。該選項覆蓋配置屬性commiturl。

git config --get-all svn-remote.<name>.commiturl

--parents

創(chuàng)建父文件夾。此參數(shù)等同于svn cp命令中的參數(shù)--parents,對于非標準存儲庫布局非常有用。

tag

在SVN存儲庫中創(chuàng)建一個標簽。這是一個簡寫branch -t。

log

當svn用戶引用-r /  - 修訂號時,這應該能夠輕松查找svn日志消息。

'svn log'支持以下功能:

-r <n>:<n>   --revision=<n>:<n>

支持,非數(shù)字參數(shù)不是:HEAD,NEXT,BASE,PREV等...

-v   --verbose

它不完全兼容svn日志中的--verbose輸出,但相當接近。

--limit=<n>

與--max-count不同,不會計入合并/排除提交

--incremental

支持的

新功能:

--show-commit

也顯示了Git commit sha1

--oneline

我們的版本--pretty = oneline

注意

SVN本身只存儲UTC時間,沒有別的。常規(guī)svn客戶端將UTC時間轉(zhuǎn)換為當?shù)貢r間(或基于TZ =環(huán)境)。該命令具有相同的行為。

任何其他參數(shù)都直接傳遞給 git log

blame

顯示修訂版本和作者上次修改文件的每一行。默認情況下,此模式的輸出格式與'svn blame'的輸出格式兼容。像SVN blame命令一樣,工作樹中的本地未提交更改將被忽略; HEAD修訂版本中的文件版本被注釋。未知參數(shù)直接傳遞給git blame

--git-format

git blame以與SVN版本號相同的格式生成輸出,而不是Git提交哈希。在此模式下,尚未提交給SVN的更改(包括本地工作副本編輯)顯示為修訂版0。

find-rev

當給定表單的SVN修訂號時rN,返回相應的Git提交散列(可以選擇后跟一個tree-ish來指定應該搜索哪個分支)。當給定樹時,返回相應的SVN修訂版號。

-B   --before

如果給定SVN修訂版,不要求完全匹配,而是在指定修訂版中找到與SVN存儲庫(在當前分支上)相對應的提交。

-A   --after

如果提供SVN修訂版本,則不需要完全匹配; 如果沒有完全匹配,則返回在歷史中向前搜索的最接近的匹配。

set-tree

你應該考慮使用dcommit而不是這個命令。將指定的提交或樹對象提交給SVN。這依賴于您導入的提取數(shù)據(jù)是最新的。這絕對不會嘗試在提交SVN時進行修補,它只會覆蓋樹中指定的文件或提交的文件。假定所有合并都是獨立于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 無法跟蹤的空目錄??漳夸浽谑褂谩癵it svn clone”和“git svn rebase”時會自動重新創(chuàng)建,因此“mkdirs”適用于諸如“git checkout”或“git reset”之類的命令之后。(有關(guān)更多信息,請參見 svn-remote。<name> .automkdirs 配置文件選項。)

commit-diff

提交命令行中兩個樹型參數(shù)的差異。該命令不依賴于在git svn init-ed存儲庫中。這個命令有三個參數(shù),(a)原始樹進行區(qū)分,(b)新的樹結(jié)果,(c)目標Subversion存儲庫的URL。如果您正在使用git svn-aware存儲庫(已init與之配合使用git svn),則可以省略最后一個參數(shù)(URL )。這需要-r <revision>選項。

當?shù)诙€ tree-ish 表示這樣一個對象,或者通過調(diào)用一個編輯器(請參閱下面的選項)請求時,提交消息直接提供給-mor -F選項,或者間接來自標記或提交--edit。

-m <msg>   --message=<msg>

使用給定msg的提交消息。該選項禁用該--edit選項。

-F <filename>   --file=<filename>

從給定的文件中獲取提交消息。該選項禁用該--edit選項。

info

顯示有關(guān)類似'svn info'提供的文件或目錄的信息。目前不支持-r /  - 修訂參數(shù)。使用--url選項僅輸出URL:字段的值。

proplist

列出存儲在Subversion存儲庫中關(guān)于給定文件或目錄的屬性。使用-r /  -  revision來引用特定的Subversion版本。

propget

獲取作為第一個參數(shù)給定的Subversion屬性,用于文件。可以使用-r /  -  revision指定特定的修訂版本。

propset

將作為第一個參數(shù)給出的Subversion屬性設置為作為第三個參數(shù)給出的文件的第二個參數(shù)給出的值。

例子:

git svn propset svn:keywords "FreeBSD=%H" devel/py-tipper/Makefile

這將屬性設置svn:keywordsFreeBSD=%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)容不應該改變,reset不應該有必要。但是,如果SVN權(quán)限發(fā)生變化,或者如果您更改了--ignore-paths選項,a fetch可能會因“未在提交中找到”(文件先前不可見)或“校驗和不匹配”(錯過修改)而失敗。如果問題文件永遠不能被忽略(使用--ignore-paths),修復repo的唯一方法就是使用reset。

只有rev_map和refs / remotes / git-svn被更改(請參閱$GIT_DIR/svn/*\*/.rev_map.*下面的FILES部分了解詳細信息)。跟隨reset一個fetch然后git resetgit rebase移動當?shù)胤种У叫碌臉渖稀?/p>

-r <n>   --revision=<n>

指定要保留的最新版本。以后的所有修訂都會被丟棄。

-p   --parent

同樣放棄指定的修訂版本,而是保留最近的父版本。

例子:

假設您在“主”中進行了本地更改,但您需要重新提取“r2”。

    r1---r2---r3 remotes/git-svn
                \
                 A---B master

修復首先導致“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都支持。

這可以使您在運行提取時創(chuàng)建部分鏡像; 但通常不推薦使用,因為歷史記錄會被跳過并丟失。

  • --stdin

僅用于該set-tree命令。

從stdin中讀取提交列表并按相反順序提交它們。只有領(lǐng)先的sha1從每行讀取,因此git rev-list --pretty=oneline可以使用輸出。

--rmdir

只有用過的dcommit,set-treecommit-diff命令。

如果沒有文件留下,請從SVN樹中刪除目錄。SVN可以對空目錄進行版本化,并且如果沒有剩下文件,它們不會被默認刪除。Git不能版本空目錄。啟用此標志將使SVN的行為像Git一樣行事。

config key: svn.rmdir

-e   --edit

只有用過的dcommit,set-treecommit-diff命令。

在提交SVN之前編輯提交消息。默認情況下,對于提交的對象是關(guān)閉的,并且在提交樹對象時被強制關(guān)閉。

config key: svn.edit

-l<num>   --find-copies-harder

只有用過的dcommitset-treecommit-diff命令。

他們都直接傳遞給git diff-tree; 有關(guān)更多信息,請參閱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>

如果指定了此選項并git svn遇到作者文件中不存在的SVN提交者名稱,git svn則會中止操作。用戶將不得不添加適當?shù)臈l目。git svn作者文件被修改后重新運行前面的命令應該繼續(xù)運行。

config key: svn.authorsfile

--authors-prog=<filename>

如果指定了此選項,則對于作者文件中不存在的每個SVN提交者名稱,將使用提交者名稱作為第一個參數(shù)來執(zhí)行給定文件。該程序預計會返回一個形式為“Name <email>”的單行,該行將被視為包含在作者文件中。

config key: svn.authorsProg

-q   --quiet

git svn更簡潔。再指定一次,使其更加冗長。

-m   --merge   -s<strategy>   --strategy=<strategy>   -p   --preserve-merges

這些僅用于dcommitrebase命令。

如果a 不能使用,請直接轉(zhuǎn)至git rebase使用時間(請參閱)。dcommitgit resetdcommit

-n   --dry-run

這可以通過使用dcommitrebase,branchtag命令。

對于dcommit,打印出一系列Git參數(shù),這些參數(shù)將顯示哪些差異將提交給SVN。

對于rebase顯示與當前分支關(guān)聯(lián)的上游svn存儲庫相關(guān)聯(lián)的本地分支以及將從中獲取的svn存儲庫的URL。

對于branchtag,在創(chuàng)建分支或標記時顯示將用于復制的URL。

--use-log-author

當檢索SVN提交到Git的(作為的一部分fetchrebase或者dcommit操作),找第一From:Signed-off-by:日志消息行和使用,作為作者的字符串。

config key: svn.useLogAuthor

--add-author-from

當承諾的SVN混帳(作為的一部分commit-diff,set-tree或者dcommit操作),如果現(xiàn)有的日志消息不已經(jīng)有一個From:Signed-off-by:行,追加一個From:基于Git的行提交的作者字符串。如果你使用這個,那么--use-log-author將為所有提交檢索一個有效的作者字符串。

config key: svn.addAuthorFrom

高級選項

-i<GIT_SVN_ID>   --id <GIT_SVN_ID>

這設置GIT_SVN_ID(而不是使用環(huán)境)。這允許用戶覆蓋默認的refname以在跟蹤單個URL時獲取。的logdcommit命令不再需要此開關(guān)作為參數(shù)。

-R<remote name>   --svn-remote <remote name>

指定要使用的svn-remote“<remote name>”部分,這允許SVN多個存儲庫被跟蹤。默認值:“svn”

--follow-parent

如果我們跟蹤分支(使用存儲庫布局選項之一--trunk,--tags, -  branch,--stdlayout),此選項才相關(guān)。對于每個追蹤分支,嘗試找出其修訂版本從哪里復制而來,并在分支的第一個Git提交中設置合適的父代。當我們跟蹤已在存儲庫中移動的目錄時,這非常有用。如果此功能被禁用,則由所創(chuàng)建的分支git svn將全部為線性,并且不共享任何歷史記錄,這意味著將不會有關(guān)于分支分支或合并的信息。但是,長時間/復雜的歷史記錄可能需要很長時間,因此禁用此功能可能會加速克隆過程。此功能默認啟用,請使用--no-follow-parent將其禁用。

config key: svn.followparent

配置文件專用選項

svn.noMetadata   svn-remote.<name>.noMetadata

這可以git-svn-id:在每次提交結(jié)束時刪除這些行。

此選項只能用于一次導入,因為git svn如果沒有元數(shù)據(jù),將無法再次獲取。此外,如果您丟失了$GIT_DIR/svn/*\*/.rev_map.*文件,git svn將無法重建它們。

這個git svn log命令也不會在使用它的存儲庫上工作。這與使用useSvmProps(希望)顯而易見的原因相矛盾。

不推薦使用此選項,因為這會導致難以在現(xiàn)有文檔,錯誤報告和歸檔中追蹤對SVN修訂號的舊引用。如果你打算最終從SVN遷移到Git,并確定要刪除SVN歷史記錄,請考慮使用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)建的鏡像中重新映射存儲庫URL和UUID。

如果一個SVN修訂版有一個屬性“svm:headrev”,那么修改可能是由SVN :: Mirror(也被SVK使用)創(chuàng)建的。該屬性包含存儲庫UUID和修訂版。我們希望使它看起來像我們鏡像原始URL,因此引入一個幫助函數(shù),該函數(shù)返回原始標識URL和UUID,并在提交消息中生成元數(shù)據(jù)時使用它。

svn.useSvnsyncProps   svn-remote.<name>.useSvnsyncprops

類似于useSvmProps選項; 這是針對隨SVN 1.4.x及更高版本分發(fā)的svnsync(1)命令的用戶。

svn-remote.<name>.rewriteRoot

這允許用戶從備用URL創(chuàng)建存儲庫。例如,管理員可以git svn在本地運行服務器(通過file://訪問),但希望在元數(shù)據(jù)中使用公共http://或svn:// URL分發(fā)存儲庫,以便用戶可以看到公共URL 。

svn-remote.<name>.rewriteUUID

類似于useSvmProps選項; 這適用于需要手動重新映射UUID的用戶。在原始UUID無法通過useSvmProps或useSvnsyncProps獲得的情況下,這可能會很有用。

svn-remote.<name>.pushurl

與Git類似remote.<name>.pushurl,此密鑰旨在用于url通過只讀傳輸指向SVN存儲庫以提供備用讀/寫傳輸?shù)那闆r。假定兩個鍵都指向同一個存儲庫。不像commiturlpushurl是一個基本路徑。如果使用commiturlpushurl可以使用,commiturl則優(yōu)先。

svn.brokenSymlinkWorkaround

這將禁用潛在的昂貴檢查來解決由破碎的客戶端檢入到SVN中的損壞的符號鏈接。如果您跟蹤具有許多空符號鏈接的SVN存儲庫,請將此選項設置為“false”。該選項可以在git svn運行時更改,并在下一個修訂版本生效。如果未設置,則git svn假定此選項為“true”。

svn.pathnameencoding

這指示git svn重新編碼給定編碼的路徑名。它可以被Windows用戶和非UTF8語言環(huán)境中的用戶使用,以避免使用非ASCII字符損壞的文件名。有效的編碼是Perl的Encode模塊支持的編碼。

svn-remote.<name>.automkdirs

通常,“git svn clone”和“git svn rebase”命令會嘗試重新創(chuàng)建Subversion存儲庫中的空目錄。如果此選項設置為“false”,則只有在顯式運行“git svn mkdirs”命令時才會創(chuàng)建空目錄。如果未設置,則git svn假定此選項為“true”。

由于noMetadata,rewriteRoot,rewriteUUID,useSvnsyncProps和useSvmProps選項都會影響生成和使用的元數(shù)據(jù)git svn; 它們必須在導入任何歷史記錄之前在配置文件中設置,并且這些設置一旦設置就不會被更改。

此外,每個svn-remote部分只能使用其中一個選項,因為它們會影響git-svn-id:元數(shù)據(jù)行,但可以一起使用的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寫入服務器上的存儲庫,并讓每個人都使用以下內(nèi)容克隆該存儲庫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 rebasegit rebase,而不是git pullgit merge以非整合的提交與同步git svn分支。這樣做會使未集成的提交歷史與上游SVN存儲庫保持線性關(guān)系,并允許使用首選的git svn dcommit子命令將未集成的提交推回到SVN中。

最初,git svn建議開發(fā)商從git svn分支機構(gòu)撤出或合并。這是因為作者傾向于git svn set-tree B提交一個單獨的頭部而不是git svn set-tree A..B標記來提交多個提交。使用git pullgit merge使用git svn set-tree A..B會導致觸犯到SVN時被壓扁的非線性歷史,這可能導致合并提交意外扭轉(zhuǎn)了以前的SVN提交。

Merge tracking

雖然git svn可以追蹤采用標準布局的存儲庫的復制歷史記錄(包括分支和標簽),但它還不能代表SVT用戶在git上游發(fā)生的合并歷史記錄。因此,建議用戶在Git中保持歷史盡可能線性,以便與SVN兼容(請參閱下面的CAVEATS部分)。

Handling of svn branches

如果git svn配置為獲取分支(并且--follow分支有效),它有時會為一個SVN分支創(chuàng)建多個Git分支,其中附加分支具有表單名稱branchname@nnn(其中nnn為SVN修訂版號)。如果git svn在SVN分支中找不到第一次提交的父提交,則將創(chuàng)建這些附加分支,以將分支連接到其他分支的歷史記錄。

通常情況下,SVN分支中的第一次提交由復制操作組成。git svn將讀取此提交以獲取分支創(chuàng)建的SVN修訂。然后它將嘗試找到與此SVN修訂版相對應的Git提交,并將其用作分支的父代。但是,有可能沒有合適的Git提交作為父代。除此之外,如果SVN分支是未被獲取的修訂副本git svn(例如,因為它是舊版本而被跳過--revision),或者在SVN中復制的目錄未被跟蹤git svn(比如根本沒有跟蹤的分支,或者被跟蹤分支的子目錄)。在這些情況下,git svn仍然會創(chuàng)建一個Git分支,但不是使用現(xiàn)有的Git提交作為分支的父代,它會讀取分支復制的目錄的SVN歷史記錄,并創(chuàng)建適當?shù)腉it提交。這由消息“Initializing parent:<branchname>”表示。

另外,它會創(chuàng)建一個名為特殊分支<branchname>@<SVN-Revision>,其中<SVN-Revision>是該分支從其復制的SVN修訂號。這個分支將指向分支的新創(chuàng)建的父提交。如果在SVN中該分支已被刪除,并稍后從不同版本重新創(chuàng)建,則會有多個這樣的分支@。

請注意,這可能意味著為單個SVN修訂版創(chuàng)建了多個Git提交。

一個例子:在一個具有標準trunk / tags / branches布局的SVN倉庫中,在r.100中創(chuàng)建一個目錄trunk / sub。在r.200中,trunk / sub通過將其復制到分支/來進行分支。git svn clone -s然后將創(chuàng)建一個分支sub。它還將為r.100到r.199創(chuàng)建新的Git提交并將其用作分支的歷史記錄sub。因此,從r.100到r.199的每個修訂將有兩個Git提交(其中一個包含trunk /,一個包含trunk / sub /)。最后,它會創(chuàng)建一個分支,sub@200指向分支的新的父提交sub(即提交r.200和trunk / sub /)。

Caveats

為簡單起見,并與Subversion互操作,則建議所有git svn用戶克隆,提取和dcommit直接從SVN服務器,并避免所有git clone/ pull/ merge/ pushGit存儲區(qū)和支路之間的操作。GIT中分支和用戶之間交換代碼的推薦的方法是git format-patchgit am,或只是“dcommit'ing至SVN庫。

正在運行git mergegit pull不建議您計劃dcommit從分支機構(gòu)運行,因為Subversion用戶無法看到您所做的任何合并。此外,如果您從SVN分支的鏡像Git分支合并或拉出,dcommit可能會提交到錯誤的分支。

如果您合并,請注意以下規(guī)則:git svn dcommit將嘗試提交在名為in的SVN提交之上

git log --grep=^git-svn-id: --first-parent -1

must因此,您確保您想要提交的分支的最近提交是first合并的父代。否則就會出現(xiàn)混亂,尤其是如果第一個父代在同一個SVN分支上是較舊的提交。

git clone不會在refs / remotes /層次結(jié)構(gòu)或任何git svn元數(shù)據(jù)或配置下克隆分支。因此,如果要完成克隆,使用創(chuàng)建和管理的存儲庫git svn應該rsync用于克隆。

由于dcommit內(nèi)部使用重訂,任何的Git分支您git push之前dcommit就需要迫使現(xiàn)有裁判的覆蓋上的遠程存儲庫。這通常被認為是不好的做法,詳情請參閱git-push [1]文檔。

不要在您已經(jīng)提交的更改中使用git-commit [1]的--amend選項。對于已經(jīng)推送到其他用戶的遠程存儲庫的驗證提交被認為是不好的做法,而使用SVN的dcommit與此類似。

克隆SVN倉庫時,如果沒有使用描述倉庫布局的選項(--trunk,--tags, -  branch,--stdlayout),git svn clone將創(chuàng)建一個完全線性歷史記錄的Git倉庫,其中分支和標簽在工作副本中顯示為單獨的目錄。雖然這是獲取完整存儲庫副本的最簡單方法,但對于擁有多個分支的項目,它將導致工作副本比主干大很多倍。因此,對于使用標準目錄結(jié)構(gòu)(中繼/分支/標簽)的項目,建議使用選項進行克隆--stdlayout。如果項目使用非標準結(jié)構(gòu),并且/或者不需要分支和標簽,則只需克隆一個目錄(通常為主干)即可,而無需提供任何存儲庫布局選項。如果需要帶分支和標簽的完整歷史記錄,則必須使用選項--trunk/ --branches/ --tags

當使用多分支或 - 標簽時,git svn不會自動處理名稱沖突(例如,如果來自不同路徑的兩個分支具有相同名稱,或者分支和標簽具有相同名稱)。在這些情況下,使用init設置您的Git存儲庫,然后在第一次之前fetch編輯$ GIT_DIR / config文件,以便分支和標簽與不同的名稱空間相關(guān)聯(lián)。例如:

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中,可以(雖然不鼓勵)對標簽提交更改(因為標簽只是目錄副本,因此在技術(shù)上與分支相同)。克隆SVN存儲庫時,git svn不知道將來是否會對此標簽進行提交。因此,它保守地行事,并將所有SVN標簽作為分支導入,以標簽名稱作為前綴tags/。

組態(tài)

git svn將svn-remote配置信息存儲在存儲庫$ GIT_DIR / config文件中。它類似于核心的Git遠程部分,但fetch鍵不接受glob參數(shù); 但它們是由branchestags鍵來處理的。由于一些SVN存儲庫奇怪地配置了多個項目glob擴展,允許使用下面列出的項目:

[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 包圍),遠程通配符就可以在任何地方。這種類型的配置不會自動創(chuàng)建init,應該使用文本編輯器或使用手動輸入git config。

另請注意,每個單詞只允許使用一個星號。例如:

branches = branches/re*se:refs/remotes/project-a/branches/*

將匹配樹枝release,rese,re123se然而,

branches = branches/re*s*e:refs/remotes/project-a/branches/*

會產(chǎn)生一個錯誤。

也可以通過在大括號中使用逗號分隔的名稱列表來獲取分支或標簽的子集。例如:

[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/*

在這種配置中創(chuàng)建分支需要使用-d或--destination標志來消除使用哪個位置:

$ git svn branch -d branches/server release-2-3-0

請注意,git-svn會跟蹤出現(xiàn)分支或標記的最高版本。如果分支或標簽的子集在獲取后發(fā)生更改,則必須手動編輯$ GIT_DIR / svn / .metadata以根據(jù)需要刪除(或重置)分支-maxRev和/或tags-maxRev。

Files

$GIT_DIR/svn/*\*/.rev_map.*

Subversion版本號和Git提交名之間的映射。在沒有設置noMetadata選項的存儲庫中,可以從每次提交結(jié)束時的git-svn-id:行重新創(chuàng)建(參見svn.noMetadata上面的細節(jié)部分)。

git svn fetchgit svn rebase自動更新rev_map,如果它丟失或不是最新的。git svn reset自動倒帶它。

Previous article: Next article: