簡體   English   中英

如何將項目的某些部分移動到 Git 分支而不丟失其歷史記錄?

[英]How to move some parts of a project into Git branches without losing their history?

我在 2006 年開始使用 CVS 開始我的主要項目,2008 年搬到 Subversion,2021 年搬到 Git,但一開始,我是版本控制方面的新手,我的存儲庫很亂,我的游戲有幾個不同的實現。

我想將它們移動到單獨的分支中,但我不想丟失分支之間的歷史記錄,即我希望能夠在日志中找到一些文件最初位於“主”分支中但被移到了“pre-alpha”分支。 我怎樣才能做到這一點? 我應該創建一個分支,切換到它,刪除其中無關的文件,go 回到“主”分支並刪除新分支中已經存在的文件嗎? 這是為此目的使用 Git 的正確方法嗎?

PS:我是根據 larsks 的回答做的:

git subtree split -b prealpha --prefix trunk
git subtree split -b alpha --prefix alpha
git subtree split -b jme --prefix tuer
git push origin prealpha
git push origin alpha
git push origin jme
git subtree split -b prebeta --prefix pre_beta
git branch -m master oldmaster
git branch -m prebeta master
git push origin oldmaster

只有最后一行不起作用:

git push origin master

: [rejected] master -> master (non-fast-forward) 錯誤:無法將引用推送到“https.//gouessej@git.code.sf.net/p/tuer/git”

簡而言之……是的。

您應該從master創建一個新分支,然后進行必要的更改以使每個分支( master和新分支)正確。

請注意,創建分支是合適的,然后將源的完全不同的副本移動到該分支的當前工作副本中。 Git 通常會在添加和刪除文件方面做正確的事情。 Git 通常無法很好地處理已重命名或移動的文件。 在這些情況下,即使文件確實是已移動或重命名的現有文件,它也可能被視為新文件。 要解決這個問題,您需要通過git mv在分支的原始內容上進行這些更改,以確保git正確。

看起來您的 Subversion --> Git 遷移可能不是最佳的; 您的master分支包含一堆頂級目錄,看起來它們可能對應於 Subversion 分支。 您向 Git 的遷移應該已將這些轉換為 Git 分支。

我簡要地看了一下這個項目,我很難辨別各個分支之間的關系。 例如,我希望對pre_beta的更改會在某些時候與alpha代碼共享一個共同的歷史,但我無法找到明顯的匹配項。

我們可以使用git subtree將這些頂級目錄拆分為不同的分支。 我會做類似的事情:

git subtree split -b alpha --prefix alpha
git subtree split -b pre_beta --prefix pre_beta
git subtree split -b tuer --prefix tuer
git branch -m master old_master
git branch -m pre_beta master

這會將每個目錄的歷史記錄拆分為一個單獨的分支,然后將現有的pre_beta分支轉換為master分支(因為它似乎具有最新的更改)。

這讓你:

$ git branch
  alpha
* master
  old_master
  tuer
$ git checkout master
$ ls
branding.properties  lib          NOTICE.txt  src
build.xml            LICENSE.txt  README.txt  versioning.properties
$ git checkout alpha
$ ls
about.txt  changes_2.rtf  contents.txt  lib       md3         sound    tools
bean       com            drawer        main      readme.txt  target
build.xml  connection     gpl.txt       manifest  snd         texture
$ git checkout tuer
$ ls
about.txt  changes_2.rtf  contents.txt  jme   md2         snd      tools
bean       com            drawer        lib   obj         sound
build.xml  connection     gpl.txt       main  readme.txt  texture
$ git checkout old_master
$ ls
alpha  pre_beta  trunk  tuer

您可以在https://github.com/larsks/tuer-git查看結果。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM