我想要的是一种将代码从我的Web服务器推送到远程存储库中的孤立分支的整洁方式,而不会在Web服务器上留下任何Git存储库,而无需首先将整个远程存储库克隆到Web服务器上。我还需要在Web服务器上保持当前未修改的文件不受影响。
编辑:为了澄清,我不是要求设置部署或任何类型的方法,我已经有了这个工作。我只需要一种方法将现有代码从非版本化目录推送到远程存储库中的新孤立分支,而不会弄乱Web服务器上的文件,也不会留下任何.git
文件。
我最近开始使用Git对我的所有网站进行版本控制。它看起来比FTP事情容易得多,并且允许所有具有完整历史和修订的团队工作。我正在将所有内容导入Git repos,但我遇到了一些问题。
我有一个项目,它有多个(孤儿)分支,代表代码的不同部署目标。出于这个问题的目的,这就是我的设置:
我有3台服务器。两个是Web服务器,另一个是混合Web-Git服务器。
其中一个Web服务器是一个小型虚拟机,作为Cloudflare的CDN后端运行。它运行一个nginx服务器并简单地为Cloudflare提供一次或两次服务和更改或新文件以进行缓存(这很小,因为Cloudflare只请求文件一次,这意味着它不处理大量请求)。
我的第二个Web服务器托管实际的网站,并包含应用程序的整个服务器后端。
出于说明目的,两个Web服务器都是单独的计算机。第三台机器只是Git服务器,并托管了一堆Atlassian应用程序。
我还有一个以前的SVN存储库,其中包含与项目相关的服务器的C#源代码。
我已将现有的SVN存储库导入Git存储库的“master”。我现在想要创建2个孤立分支,一个用于CDN文件,一个用于网站文件。
经过一些研究后,我发现了这样的事情:git checkout --orphan <branchname>
。这就是我的问题所在。我想创建一个分支来推送CDN等代码,然后从当前的Web服务器推送代码,而不必克隆整个存储库。因为git checkout
要求现有的git repo位于工作目录中,所以我不知道如何执行此操作。我尝试git init
- 我的文件所在的目录,在本地创建一个新分支,进行编辑,然后将它们推送到一个git push git@mydomain.com:me/the_repo +local_branch:cdn_branch
的远程分支,但这不起作用,并留下了一个Git存储库我的网络服务器WWW文件夹。
答案 0 :(得分:1)
你可以跳过很多:
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 :(得分:0)
经过一些实验后,我得出了以下解决方案:
首先转到您希望推送到孤儿分支的目录
EG:cd /var/www
初始化一个空的Git存储库
EG:git init .
添加当前目录中的所有文件
EG:git add .
提交他们
EG:git commit -m "Importing existing code to branch blah"
将分支推送到远程仓库
EG:git push <URL> master:<BRANCH NAME>
清理时间
EG:rm -fr .git
这对我来说无需将整个Git存储库克隆到我的网络服务器上!让我有一段时间的事实是,孤立的分支只有在你提交文件后才会被创建。多次我尝试git checkout --orphan BRANCH
并使我感到困惑,因为当我输入git branch
时分支没有显示。
答案 2 :(得分:0)
合并两个存储库的方法是简单地将对象从一个.git/objects
目录复制到另一个目录。
将repoA/.git/objects/*
复制到repoB/.git/objects/
后,repoA的对象(文件的提交和修订,而不是分支和简单标记)应按原样显示在repoB中。
从repoA导入的提交没有被repoB的任何分支指向,所以他们将暂停提交片刻。您可以在repoB之后创建指向那些导入的提交的分支。
可能存在的风险是可能存在冲突的SHA1哈希(仅提及可能性,这不应经常发生)。
==
不确定我是否明白你想做什么。也许你想用git子模块管理部分内容?
答案 3 :(得分:0)
听起来你想提交一台服务器并发布到另外两台服务器而没有发布服务器上的所有文件,历史记录等 - 我建议为复制的标签设置post commit过滤器将文件发布到其他两台服务器。