7

我有一个工作的、实时的网站,我确信每个文件都有最新、正确的版本,它不是用 Git 管理的。我还有一个 Bitbucket Git 存储库,表面上是针对该站点的,但其中存在重大问题和过时的内容。

我想做git init的实时文件,然后以某种方式将它们推送到远程,以便最终的远程 HEAD 状态与我的实时文件的状态完全相同,而且远程提交历史记录保持不变。

我想这样做,以便实时工作树永远不会处于不同的状态。我曾想过创建一个新分支,拉远程主控,然后强制合并它们或其他什么,但据我所知,我将不得不检查主分支并在那些短暂的时刻弄乱实时文件在合并之前和合并期间,假设一切正常。

我还想过只用 FTP 下载文件,在我的本地计算机上解决所有冲突/合并,然后从那里推送到 Bitbucket 并下拉到实时存储库。但这也让人感觉不可靠且有风险。

我知道我不应该像这样操作实时代码,但这是我遇到的情况,我只想要最简单/最安全的方法来让它工作。

(我确定这是一个重复的问题,但我的 Google-fu 让我失望了;在引导我回答之前的答案时请保持温和。)

4

3 回答 3

2

试试 git merge -s。

git merge -s ours origin/remote_branch

这解决了任意数量的头,但合并的结果树始终是当前分支头的树,有效地忽略了所有其他分支的所有更改。它旨在用于取代分支的旧开发历史。

于 2013-11-13T04:47:46.837 回答
0

如果您确定在线文件是最新的并且 repo 上的文件遵循相同的历史记录,您应该检查当前的 Git 历史记录。只需将 FTP 的内容复制粘贴到这些文件上即可。

然后,您将处于 FTP 的最新版本,并且在线所做的更改将应用​​于当前 Git 历史记录之上。

但可以肯定的是,如果您不确定这两个代码库是否存在分歧,那么这是“冒险”的过程。但是您对此无能为力,因为没有在线文件​​历史记录,您就无法进行三路合并(只有两种方式)。

所以,从那里。我会逐行查看差异以确保。如果您对历史是否存在分歧有疑问,那么手动任务确实没有办法。

于 2013-11-12T22:47:49.983 回答
0

我认为这应该很容易通过对.git目录进行一些操作来实现。

创建测试设置

cd ~/Desktop/test/
mkdir outdated server
cd outdated && touch testfile1 testfile2 testfile3
git init && git add . && git commit -m "testfiles"
cd .. && git clone --bare outdated/ cloud_hosted_repo

到目前为止,我们已经拥有cloud_hosted_repo应该等同于 的目录github repooutdated该目录应该被视为等同于本地签出的副本github repo code(例如在开发人员机器上),以及server我们应该将其视为远程服务器的目录。

登录服务器并在服务器上创建已部署的项目

cd server && mkdir project_location some_other_location
cd project_location/ && touch testfile4 testfile5 testfile6 && cd ..

如果这个项目位置已经是一个 git repo,移动 .git 目录

mv project_location/.git project_location/.git.backup

将原始存储库克隆到某个位置并从中清除文件

cd some_other_location/ && git clone ../../cloud_hosted_repo/ .
git rm "*" && git commit -m "removed all older files" && cd ..

移动.git回购

mv some_other_location/.git/ project_location/ && cd project_location/
git add . && git commit -m "Updated Project" && git push origin master

我们完成了。

git log将显示分支中的所有提交。

您可以在任何需要的地方添加额外的复杂性(例如为备份创建额外的分支等)。

于 2013-11-13T14:41:23.167 回答