0

tl;博士

我想要的是一种整洁的方法,可以将代码从我的 Web 服务器推送到远程存储库中的孤立分支,之后无需在 Web 服务器上留下任何 Git 存储库,也无需先将整个远程存储库克隆到 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创建文件所在的目录,在本地创建一个新分支,提交它们,然后将它们推送到远程分支,git push git@mydomain.com:me/the_repo +local_branch:cdn_branch但这不起作用,并在我的 Web 服务器 WWW 文件夹中留下了一个 Git 存储库。

4

4 回答 4

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
于 2013-10-12T16:15:21.493 回答
0

经过一些实验,我得出了以下解决方案:

  1. 首先转到您希望推送到孤儿分支的目录

    例如:cd /var/www

  2. 初始化一个空的 Git 存储库

    例如:git init .

  3. 添加当前目录下的所有文件

    例如:git add .

  4. 提交他们

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

  5. 将分支推送到远程仓库

    例如:git push <URL> master:<BRANCH NAME>

  6. 清理时间

    例如:rm -fr .git

这为我完成了它,而无需将整个 Git 存储库克隆到我的网络服务器上!让我有一段时间的原因是孤立分支只有在您向其提交文件后才会创建。多次尝试git checkout --orphan BRANCH并让我感到困惑,因为我输入时分支没有显示git branch

于 2013-10-12T06:21:22.767 回答
0

听起来您想提交到一台服务器并发布到另外两台服务器,而不需要发布服务器上的所有文件、历史记录等 - 我建议为复制发布文件的标签设置提交后过滤器到其他两台服务器。

于 2013-10-12T10:51:24.527 回答
0

合并两个存储库的一种方法是简单地将对象从一个.git/objects目录复制到另一个目录。

复制repoA/.git/objects/*到后repoB/.git/objects/,repoA 的对象(文件的提交和修订,而不是分支和简单标签)应该按原样出现在 repoB 中。

从 repoA 导入的提交不会被 repoB 的任何分支指向,因此它们将暂时悬空提交。之后,您可以在 repoB 中创建指向这些导入提交的分支。

一个可能的风险是可能存在冲突的 SHA1 哈希(仅提及这种可能性,这不应该经常发生)。

======

不太确定我是否理解你想要做什么。也许你想用 git submodule 管理部分内容?

于 2013-10-12T06:31:42.260 回答