簡體   English   中英

如何將現有目錄導入孤分支

[英]How to import an existing directory to an orphan branch

tl; dr

我想要的是一種整齊的方法,可以將代碼從Web服務器推送到遠程存儲庫中的孤立分支,而之后無需在Web服務器上保留任何Git存儲庫,而不必先將整個遠程存儲庫克隆到Web服務器上。 我還需要在Web服務器上保留當前未版本控制的文件。

編輯:為澄清起見,我不要求設置部署或任何種類的方法,我已經可以使用了。 我只需要一種方法就可以整齊地將現有代碼從非版本目錄推送到遠程存儲庫中的新孤立分支,而不會弄亂Web服務器上的文件和文件,也不會留下任何.git文件。

背景資料

最近,我開始使用Git對所有網站進行版本控制的趨勢。 似乎比FTP事情要容易得多,並且允許具有完整歷史記錄和修訂版本的團隊一起工作。 我正在經歷將所有內容導入Git倉庫的過程,但是我遇到了一個問題。

我有一個項目,該項目將具有代表不同代碼部署目標的多個(孤立)分支。 出於這個問題的目的,這就是我的設置:

我有3台服務器。 兩個是Web服務器,一個是混合Web-Git服務器。

Web服務器之一是一個小型VM,可以用作Cloudflare的CDN后端。 它運行一台nginx服務器,只需向Cloudflare緩存一次或兩次或更改或更改新文件即可(這很小,因為Cloudflare僅請求一次文件,這意味着它不處理大量請求)。

我的第二台Web服務器托管實際的網站,並包含應用程序的整個服務器后端。

出於說明目的,兩個Web服務器都是單獨的計算機。 第三台機器只是Git服務器,並托管了許多Atlassian應用程序。

我以前也有一個SVN存儲庫,其中包含與該項目相關的服務器的C#源代碼。

問題

我已經將現有的SVN存儲庫導入到Git存儲庫的“主服務器”中。 我現在想創建2個孤立分支,一個用於CDN文件,一個用於網站文件。

經過一番研究,我發現了這樣的事情: git checkout --orphan <branchname> 這就是我的問題所在。 我想創建一個分支來將CDN等代碼推送到,然后從當前的Web服務器推送代碼,而不必克隆整個存儲庫。 因為git checkout要求將現有的git repo放在工作目錄中,所以我不知道該怎么做。 我嘗試了git init init-將文件放置到目錄中,在本地創建一個新分支,將其提交,然后使用git push git@mydomain.com:me/the_repo +local_branch:cdn_branch將其推到遠程分支,但這沒有工作並在我的Web服務器的WWW文件夾中保留了一個Git存儲庫。

您可以跳過很多:

cd /var/www
git init
git add .
git commit -m"Importing existing code to branch blah"
git push u://r/l master:blah
rm -rf .git

經過一些試驗,我得出以下解決方案:

  1. 首先轉到您要推送到孤兒分支的目錄

    EG: cd /var/www

  2. 初始化一個空的Git倉庫

    EG: git init .

  3. 添加當前目錄中的所有文件

    EG: git add .

  4. 提交他們

    EG: git commit -m "Importing existing code to branch blah"

  5. 將分支推送到遠程倉庫

    EG: git push <URL> master:<BRANCH NAME>

  6. 清理時間

    EG: rm -fr .git

這樣做對我來說無需將整個Git存儲庫克隆到我的Web服務器上! 使我困擾了一段時間的事實是,僅當您將文件提交后,孤立分支才會創建。 我多次嘗試git checkout --orphan BRANCH並迷惑了我,因為當我輸入git branch時分支沒有顯示。

合並兩個存儲庫的一種方法是簡單地將對象從一個.git/objects目錄復制到另一個.git/objects

repoA/.git/objects/*復制到repoB/.git/objects/repoB/.git/objects/對象(文件的提交和修訂,不是分支和簡單標簽)應原樣出現在repoB中。

從repoA導入的提交未由repoB的任何分支指向,因此它們將暫時懸空提交。 之后,您可以創建一個分支,指向在repoB中導入的那些提交。

可能的風險是可能存在沖突的SHA1哈希(僅提及可能性,這種情況不應該經常發生)。

======

不太確定我是否了解您想要做什么。 也許您想使用git子模塊管理部分內容?

聽起來您想提交到一台服務器,然后釋放到另一台服務器,而沒有發布服務器上的所有文件,歷史記錄等-我建議為復制發布文件的標簽設置提交后過濾器到其他兩個服務器。

暫無
暫無

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

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