从新的本地仓库强制推送 Git 到远程,但保留远程提交历史记录。

8
我有一个正在运行的网站,我确信它拥有每个文件的最新和正确版本,但该网站没有使用Git进行管理。我还有一个Bitbucket Git仓库,理论上是为该网站而创建的,但其中存在重大问题和过时的内容。
我想做的是 git init 这些实时文件,然后以某种方式将它们推送到远程,使得最终远程 HEAD 状态与我的实时文件状态完全相同,但同时也保留远程提交历史记录。
我想这样做是为了使实时工作树永远不处于不同的状态。我考虑创建一个新分支,拉取主分支,然后强制合并它们或其他操作,但据我所知,我必须检出主分支,并在合并之前和期间对实时文件进行干扰,假设一切都正确。
我还考虑过只需通过FTP下载文件,在本地计算机上解决所有冲突/合并,然后从那里推送到Bitbucket并从实时仓库中拉取。但这也感觉不可靠和冒险。
我知道我不应该像这样操纵实时代码,但这就是我遇到的情况,我只想找到最简单/最安全的方法使其正常工作。
(我确定这是一个重复的问题,但我的谷歌搜索失败了,请在指导我查看以前的答案时温柔一点。)
3个回答

3
尝试使用 git merge -s 命令。
git merge -s ours origin/remote_branch

这个命令可以解决任意数量的分支,但合并后的树总是当前分支头部的树,忽略了所有其他分支的更改。它旨在用于取代旧的侧分支开发历史。

1
我无法编辑此答案,因为建议的编辑队列已满。但是,这对我有用。截至Git 2.9的正确命令是:git merge -s ours --allow-unrelated-histories origin/remote_branch。它从服务器获取整个提交历史记录,非常棒。以下是详细讨论的线程:https://dev59.com/ploU5IYBdhLWcg3wAjYs#37938036 - dimiguel

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 repo,一个名为outdated的目录,应该被视为本地检出的github repo code副本(例如在开发者机器上),以及一个名为server的目录,我们将把它视为远程服务器。
登录到服务器并在服务器上创建部署项目。
cd server && mkdir project_location some_other_location
cd project_location/ && touch testfile4 testfile5 testfile6 && cd ..

如果此项目位置已经是一个 git 存储库,请移动 .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 将显示分支中的所有提交。

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


0

如果您确定在线文件是最新的,并且仓库中的文件遵循相同的历史记录,那么您应该检出当前的Git历史记录。然后只需将FTP的内容复制粘贴到这些文件上。

然后,您将获得来自FTP的最新版本,并且在线进行的更改将应用于当前的Git历史记录之上。

但是,如果您不确定两个代码库已经分歧,那么这是一种“冒险”的过程。但是,您无法对此做任何事情,因为没有在线文件历史记录,您无法进行三方合并(仅限两方)。

因此,从那里开始。我会逐行审查差异以确保。如果您对历史记录是否分歧有疑问,那么真的没有绕过手动任务的方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接