乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      Git 和 SVN 協(xié)同模型

       NaturalWill 2015-06-12

      Git 和 SVN 協(xié)同模型

      第五個(gè)部分是我撰寫的 GIT 圖書的最重要的一個(gè)部分,這個(gè)部分馬上就要收尾了,以 git-svn 作為該部分的最后一章。
      在Git 協(xié)同模型部分的最后,我們將會(huì)在另外的一個(gè)角度上看 Git 版本庫(kù)的協(xié)同。不是不同的用戶在使用 Git 版本庫(kù)時(shí)如何協(xié)同,也不是一個(gè)項(xiàng)目包含多個(gè) Git 版本庫(kù)時(shí)如何協(xié)同,而是當(dāng)版本控制系統(tǒng)不是 Git (如 Subversion)時(shí),如何能夠繼續(xù)使用 Git 的方式進(jìn)行操作。

      5.7   Git 和 SVN 協(xié)同模型

      Subversion 會(huì)一直在商業(yè)軟件開發(fā)占據(jù)主導(dǎo),只要商業(yè)軟件公司封閉源代碼的策略不改變。對(duì)于熟悉了 Git 的用戶,一定會(huì)對(duì) Subversion 的那種一旦脫離網(wǎng)絡(luò)、脫離服務(wù)器便寸步難行的工作模式厭煩透頂。實(shí)際上對(duì) Subversion 的集中式版本控制的不滿和改進(jìn)在 Git 誕生之前就發(fā)生了,這就是 SVK。 在 2003 年(Git 誕生的前兩年),臺(tái)灣的高嘉良就開發(fā)了 SVK,用分布式版本控制的方法操作 SVN。其設(shè)計(jì)思想非常樸素,既然 SVN 的用戶可以看到有訪問(wèn)權(quán)限數(shù)據(jù)的全部歷史,那么也應(yīng)該能夠依據(jù)歷史重建一個(gè)本地的 SVN 版本庫(kù),這樣很多 SVN 操作都可以通過(guò)本地的 SVN 進(jìn)行從而脫離網(wǎng)絡(luò)。當(dāng)對(duì)本地版本庫(kù)的修改感到滿意后,通過(guò)本地SVN版本和服務(wù)器的SVN版本庫(kù)的雙向同步將改動(dòng)歸并到服務(wù)器上。這種工作方式真的非常 酷。 我們不必為 SVK 的文檔缺乏以及不再維護(hù)而感到惋惜,因?yàn)橛懈鼜?qiáng)的工具登場(chǎng)了,這就是 git-svn。Git-svn 是 Git 軟件包的一部分,用 Perl 語(yǔ)言開發(fā)。它的工作原理是:
      • 將 Subversion 版本庫(kù)在本地轉(zhuǎn)換為一個(gè) Git 庫(kù)。
      • 轉(zhuǎn)換可以基于 Subversion 的某個(gè)目錄,或者基于某個(gè)分支,或者整個(gè) Subversion 代碼庫(kù)的所有分支和里程碑。
      • 遠(yuǎn)程的 Subversion 版本庫(kù)可以和本地的 Git 雙向同步。Git 本地庫(kù)修改推送到遠(yuǎn)程 Subversion 版本庫(kù),反之亦然。
      Git-svn 作為 Git 軟件包的一部分,當(dāng) Git 從源碼包進(jìn)行安裝時(shí)會(huì)默認(rèn)安裝,提供 git svn 命令。但一些 Linux 發(fā)行版 git-svn 作為一個(gè)獨(dú)立的軟件包,需要手動(dòng)進(jìn)行安裝。例如 Debian 和 Ubuntu 運(yùn)行下面命令安裝 git-svn 。
      $ sudo aptitude install git-svn
      
      將 git-svn 獨(dú)立安裝是因?yàn)?git-svn 軟件包有著特殊的依賴,即依賴 Subversion 的 perl 語(yǔ)言綁定接口,Debian/Ubuntu 上由 libsvn-perl 軟件包提供。 當(dāng) git-svn 正確安裝后,就可以使用 git svn 命令了。但如果在執(zhí)行 git svn --version 時(shí)遇到下面的錯(cuò)誤,則說(shuō)明 Subversion 的 perl 語(yǔ)言綁定沒(méi)有正確安裝。
      $ git svn --version
      Can't locate loadable object for module SVN::_Core in @INC (@INC contains: /usr/share/perl/5.10.1 /etc/perl /usr/local/lib/perl/5.10.1 /usr/local/share/perl/5.10.1 /usr/lib/perl5 /usr/share/perl5 /usr/lib/perl/5.10 /usr/share/perl/5.10 /usr/local/lib/site_perl /usr/local/lib/perl/5.10.0 /usr/local/share/perl/5.10.0 .) at /usr/lib/perl5/SVN/Base.pm line 59
      BEGIN failed--compilation aborted at /usr/lib/perl5/SVN/Core.pm line 5.
      Compilation failed in require at /usr/lib/git-core/git-svn line 41.
      
      遇到上面的情況,需要檢查本機(jī)是否正確安裝了 Subversion 以及 Subversion 的 perl 語(yǔ)言綁定。 為了便于對(duì) git-svn 的介紹和演示,我們需要有一個(gè) Subversion 版本庫(kù),并且需要有提交權(quán)限以便演示用 Git 向 Subversion 進(jìn)行提交。最好的辦法是在本地創(chuàng)建一個(gè) Subversion 版本庫(kù)。
      $ svnadmin create /path/to/svn/repos
      
      $ svn co file:///path/to/svn/repos svndemo
      取出版本 0
      
      $ cd svndemo
      
      $ mkdir trunk tags branches
      $ svn add *
      A         branches
      A         tags
      A         trunk
      
      $ svn ci -m "initialized."
      增加           branches
      增加           tags
      增加           trunk
      
      提交后的版本為 1。
      
      我們?cè)傧?Subversion 開發(fā)主線 trunk 中添加些數(shù)據(jù)。
      $ echo hello > trunk/README
      $ svn add trunk/README
      A         trunk/README
      $ svn ci -m "hello"
      增加           trunk/README
      傳輸文件數(shù)據(jù).
      提交后的版本為 2。
      
      建立分支:
      $ svn up
      $ svn cp trunk branches/demo-1.0
      A         branches/demo-1.0
      $ svn ci -m "new branch: demo-1.0"
      增加           branches/demo-1.0
      
      提交后的版本為 3。
      
      建立里程碑:
      $ svn cp -m "new tag: v1.0" trunk file:///path/to/svn/repos/tags/v1.0
      
      提交后的版本為 4。
      

      5.7.1   使用 git-svn 的一般流程

      使用 git-svn 的一般流程為:
      git svn clone
            |
            v
       (本地Git庫(kù))
            |
            v
      +-> (hack...)
      |     |
      |     v
      |   git add
      |     |
      |     v
      |   git commit
      |     |
      +-----+
            |
            v
      git svn rebase
            |
            v
      git svn dcommit
      
      首先用 git svn clone 命令對(duì) Subversion 進(jìn)行克隆,創(chuàng)建一個(gè)包含 git-svn 擴(kuò)展的本地 Git 庫(kù)。在下面的示例中,我們使用 Subversion 的本地協(xié)議(file://) 來(lái)訪問(wèn)之前創(chuàng)立的 Subversion 示例版本庫(kù),實(shí)際上 git-svn 可以使用任何 Subversion 可用的協(xié)議,并可以對(duì)遠(yuǎn)程版本庫(kù)進(jìn)行操作。
      $ git svn clone -s file:///path/to/svn/repos git-svn-demo
      Initialized empty Git repository in /my/workspace/git-svn-demo/.git/
      r1 = 2c73d657dfc3a1ceca9d465b0b98f9e123b92bb4 (refs/remotes/trunk)
              A       README
      r2 = 1863f91b45def159a3ed2c4c4c9428c25213f956 (refs/remotes/trunk)
      Found possible branch point: file:///path/to/svn/repos/trunk => file:///path/to/svn/repos/branches/demo-1.0, 2
      Found branch parent: (refs/remotes/demo-1.0) 1863f91b45def159a3ed2c4c4c9428c25213f956
      Following parent with do_switch
      Successfully followed parent
      r3 = 1adcd5526976fe2a796d932ff92d6c41b7eedcc4 (refs/remotes/demo-1.0)
      Found possible branch point: file:///path/to/svn/repos/trunk => file:///path/to/svn/repos/tags/v1.0, 2
      Found branch parent: (refs/remotes/tags/v1.0) 1863f91b45def159a3ed2c4c4c9428c25213f956
      Following parent with do_switch
      Successfully followed parent
      r4 = c12aa40c494b495a846e73ab5a3c787ca1ad81e9 (refs/remotes/tags/v1.0)
      Checked out HEAD:
        file:///path/to/svn/repos/trunk r2
      
      從上面的輸出我們看到,當(dāng)執(zhí)行了 git svn clone 之后,在本地工作目錄創(chuàng)建了一個(gè) Git 庫(kù) (git-svn-demo),并將 Subversion 的每一個(gè)提交都轉(zhuǎn)換為 Git 庫(kù)中的提交。我們進(jìn)入 git-svn-demo 目錄,看看我們用 git-svn 克隆出來(lái)的版本庫(kù)。
      $ cd git-svn-demo/
      $ git branch -a
      * master
        remotes/demo-1.0
        remotes/tags/v1.0
        remotes/trunk
      $ git log
      commit 1863f91b45def159a3ed2c4c4c9428c25213f956
      Author: jiangxin <jiangxin@f79726c4-f016-41bd-acd5-6c9acb7664b2>
      Date:   Mon Nov 1 05:49:41 2010 +0000
      
          hello
      
          git-svn-id: file:///path/to/svn/repos/trunk@2 f79726c4-f016-41bd-acd5-6c9acb7664b2
      
      commit 2c73d657dfc3a1ceca9d465b0b98f9e123b92bb4
      Author: jiangxin <jiangxin@f79726c4-f016-41bd-acd5-6c9acb7664b2>
      Date:   Mon Nov 1 05:47:03 2010 +0000
      
          initialized.
      
          git-svn-id: file:///path/to/svn/repos/trunk@1 f79726c4-f016-41bd-acd5-6c9acb7664b2
      
      我們看到 Subversion 版本庫(kù)的分支和里程碑都被克隆出來(lái),并保存在 refs/remotes 下的引用中。在 git log 的輸出中,我們可以看到 Subversion 的提交的確被轉(zhuǎn)換為 Git 的提交。 下面我們就可以在 Git 庫(kù)中進(jìn)行修改,并在本地提交(用 git commit 命令)。
      $ cat README
      hello
      $ echo "I am fine." >> README
      $ git add -u
      $ git commit -m "my hack 1."
      [master 55e5fd7] my hack 1.
       1 files changed, 1 insertions(+), 0 deletions(-)
      $ echo "Thank you." >> README
      $ git add -u
      $ git commit -m "my hack 2."
      [master f1e00b5] my hack 2.
       1 files changed, 1 insertions(+), 0 deletions(-)
      
      我們對(duì)工作區(qū)中的 README 文件修改了兩次,并進(jìn)行了本地的提交。我們查看這時(shí)的提交日志,會(huì)發(fā)現(xiàn)最新兩個(gè)只在本地 Subversion 版本庫(kù)的提交和之前 Subversion 中的提交的不同。區(qū)別在于最新在 Git 中的提交沒(méi)有用 git-svn-id: 標(biāo)簽標(biāo)記的行。
      $ git log
      commit f1e00b52209f6522dd8135d27e86370de552a7b6
      Author: Jiang Xin <jiangxin@ossxp.com>
      Date:   Thu Nov 4 15:05:47 2010 +0800
      
          my hack 2.
      
      commit 55e5fd794e6208703aa999004ec2e422b3673ade
      Author: Jiang Xin <jiangxin@ossxp.com>
      Date:   Thu Nov 4 15:05:32 2010 +0800
      
          my hack 1.
      
      commit 1863f91b45def159a3ed2c4c4c9428c25213f956
      Author: jiangxin <jiangxin@f79726c4-f016-41bd-acd5-6c9acb7664b2>
      Date:   Mon Nov 1 05:49:41 2010 +0000
      
          hello
      
          git-svn-id: file:///path/to/svn/repos/trunk@2 f79726c4-f016-41bd-acd5-6c9acb7664b2
      
      commit 2c73d657dfc3a1ceca9d465b0b98f9e123b92bb4
      Author: jiangxin <jiangxin@f79726c4-f016-41bd-acd5-6c9acb7664b2>
      Date:   Mon Nov 1 05:47:03 2010 +0000
      
          initialized.
      
          git-svn-id: file:///path/to/svn/repos/trunk@1 f79726c4-f016-41bd-acd5-6c9acb7664b2
      
      現(xiàn)在我們就可以向 Subversion 服務(wù)器推送我們的改動(dòng)了。但真實(shí)的環(huán)境中,往往在我們向服務(wù)器推送時(shí),已經(jīng)有其它用戶先于我們?cè)诜?wù)器上進(jìn)行了提交。而且往往更糟的是,先于我們的提交會(huì) 造成我們的提交沖突!我們現(xiàn)在就人為的制造一個(gè)沖突:使用 svn 命令在 Subversion 版本庫(kù)中執(zhí)行一次提交。
      $ svn checkout file:///path/to/svn/repos/trunk demo
      A    demo/README
      取出版本 4。
      $ cd demo/
      $ cat README
      hello
      $ echo "HELLO." > README
      $ svn commit -m "hello -> HELLO."
      正在發(fā)送       README
      傳輸文件數(shù)據(jù).
      提交后的版本為 5。
      
      好的,我們已經(jīng)模擬了一個(gè)用戶先于我們更改了 Subversion 版本庫(kù)?,F(xiàn)在回到我們用 git-svn 克隆的本地版本庫(kù),執(zhí)行 git svn dcommit 操作,將我們?cè)?Git 中的提交推送的 Subversion 版本庫(kù)中。
      $ git svn dcommit
      Committing to file:///path/to/svn/repos/trunk ...
      事務(wù)過(guò)時(shí): 文件 “/trunk/README” 已經(jīng)過(guò)時(shí) at /usr/lib/git-core/git-svn line 572
      
      顯然,由于 Subversion 版本庫(kù)中包含了新的提交,導(dǎo)致我們執(zhí)行 git svn dcommit 出錯(cuò)。這時(shí)我們需執(zhí)行 git svn fetch 命令,以從 Subversion 版本庫(kù)獲取更新。
      $ git svn fetch
              M       README
      r5 = fae6dab863ed2152f71bcb2348d476d47194fdd4 (refs/remotes/trunk)
      15:37:08 jiangxin@hp:/my/workspace/git-svn-demo$ git st
      # On branch master
      nothing to commit (working directory clean)
      
      當(dāng)我們獲取了新的 Subversion 提交之后,我們需要執(zhí)行 git svn rebase 將我們 Git 中未推送到 Subversion 的提交通過(guò)變基(rebase)形成包含 Subversion 最新提交的線性提交。這是因?yàn)?Subversion 的提交都是線性的。
      $ git svn rebase
      First, rewinding head to replay your work on top of it...
      Applying: my hack 1.
      Using index info to reconstruct a base tree...
      Falling back to patching base and 3-way merge...
      Auto-merging README
      CONFLICT (content): Merge conflict in README
      Failed to merge in the changes.
      Patch failed at 0001 my hack 1.
      
      When you have resolved this problem run "git rebase --continue".
      If you would prefer to skip this patch, instead run "git rebase --skip".
      To restore the original branch and stop rebasing run "git rebase --abort".
      
      rebase refs/remotes/trunk: command returned error: 1
      
      果不其然,變基時(shí)發(fā)生了沖突,這是因?yàn)?Subversion 中他人的修改和我們?cè)?Git 庫(kù)中的修改都改動(dòng)了同一個(gè)文件,并且改動(dòng)了相近的行。下面按照 git rebase 沖突解決的一般步驟進(jìn)行,直到成功完成變基操作。 先編輯 README 文件,以解決沖突。
      $ git status
      # Not currently on any branch.
      # Unmerged paths:
      #   (use "git reset HEAD <file>..." to unstage)
      #   (use "git add/rm <file>..." as appropriate to mark resolution)
      #
      #       both modified:      README
      #
      no changes added to commit (use "git add" and/or "git commit -a")
      15:49:30 jiangxin@hp:/my/workspace/git-svn-demo$ vi README
      
      處于沖突狀態(tài)的 REAEME 文件內(nèi)容。
      <<<<<<< HEAD
      HELLO.
      =======
      hello
      I am fine.
      >>>>>>> my hack 1.
      
      下面是我們修改后的內(nèi)容。保存退出。
      HELLO.
      I am fine.
      
      執(zhí)行 git add 命令解決沖突
      $ git add README
      
      調(diào)用 git rebase --continue 完成變基操作。
      $ git rebase --continue
      Applying: my hack 1.
      Applying: my hack 2.
      Using index info to reconstruct a base tree...
      Falling back to patching base and 3-way merge...
      Auto-merging README
      
      看看變基之后的 Git 庫(kù)日志:
      $ git log
      commit e382f2e99eca07bc3a92ece89f80a7a5457acfd8
      Author: Jiang Xin <jiangxin@ossxp.com>
      Date:   Thu Nov 4 15:05:47 2010 +0800
      
          my hack 2.
      
      commit 6e7e0c7dccf5a072404a28f06ce0c83d77988b0b
      Author: Jiang Xin <jiangxin@ossxp.com>
      Date:   Thu Nov 4 15:05:32 2010 +0800
      
          my hack 1.
      
      commit fae6dab863ed2152f71bcb2348d476d47194fdd4
      Author: jiangxin <jiangxin@f79726c4-f016-41bd-acd5-6c9acb7664b2>
      Date:   Thu Nov 4 07:15:58 2010 +0000
      
          hello -> HELLO.
      
          git-svn-id: file:///path/to/svn/repos/trunk@5 f79726c4-f016-41bd-acd5-6c9acb7664b2
      
      commit 1863f91b45def159a3ed2c4c4c9428c25213f956
      Author: jiangxin <jiangxin@f79726c4-f016-41bd-acd5-6c9acb7664b2>
      Date:   Mon Nov 1 05:49:41 2010 +0000
      
          hello
      
          git-svn-id: file:///path/to/svn/repos/trunk@2 f79726c4-f016-41bd-acd5-6c9acb7664b2
      
      commit 2c73d657dfc3a1ceca9d465b0b98f9e123b92bb4
      Author: jiangxin <jiangxin@f79726c4-f016-41bd-acd5-6c9acb7664b2>
      Date:   Mon Nov 1 05:47:03 2010 +0000
      
          initialized.
      
          git-svn-id: file:///path/to/svn/repos/trunk@1 f79726c4-f016-41bd-acd5-6c9acb7664b2
      
      當(dāng)變基操作成功完成后,我們?cè)賵?zhí)行 git svn dcommit 向 Subversion 推送我們?cè)?Git 庫(kù)中的兩個(gè)新提交。
      $ git svn dcommit
      Committing to file:///path/to/svn/repos/trunk ...
              M       README
      Committed r6
              M       README
      r6 = d0eb86bdfad4720e0a24edc49ec2b52e50473e83 (refs/remotes/trunk)
      No changes between current HEAD and refs/remotes/trunk
      Resetting to the latest refs/remotes/trunk
      Unstaged changes after reset:
      M       README
              M       README
      Committed r7
              M       README
      r7 = 69f4aa56eb96230aedd7c643f65d03b618ccc9e5 (refs/remotes/trunk)
      No changes between current HEAD and refs/remotes/trunk
      Resetting to the latest refs/remotes/trunk
      
      推送之后本地 Git 庫(kù)中最新的兩個(gè)提交的提交說(shuō)明中也嵌入了 git-svn-id: 標(biāo)簽。這個(gè)標(biāo)簽的作用非常重要,我們?cè)谙乱还?jié)予以介紹。
      $ git log -2
      commit 69f4aa56eb96230aedd7c643f65d03b618ccc9e5
      Author: jiangxin <jiangxin@f79726c4-f016-41bd-acd5-6c9acb7664b2>
      Date:   Thu Nov 4 07:56:38 2010 +0000
      
          my hack 2.
      
          git-svn-id: file:///path/to/svn/repos/trunk@7 f79726c4-f016-41bd-acd5-6c9acb7664b2
      
      commit d0eb86bdfad4720e0a24edc49ec2b52e50473e83
      Author: jiangxin <jiangxin@f79726c4-f016-41bd-acd5-6c9acb7664b2>
      Date:   Thu Nov 4 07:56:37 2010 +0000
      
          my hack 1.
      
          git-svn-id: file:///path/to/svn/repos/trunk@6 f79726c4-f016-41bd-acd5-6c9acb7664b2
      

        本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評(píng)論

        發(fā)表

        請(qǐng)遵守用戶 評(píng)論公約

        類似文章 更多