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

时间:2013-11-12 22:41:06

标签: git version-control git-push

我有一个有效的网站,我确信每个文件的最新版本都是正确的,不是用Git管理的。我还有一个Bitbucket Git repo,表面上看起来就是那个网站,但是它有重大问题和过时的东西。

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

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

我还想过只是将文件FTP下来,解决我本地计算机上的所有冲突/合并,然后从那里推送到Bitbucket并下载到实时回购。但这也感觉不可靠和冒险。

我知道我永远不应该操纵像这样的实时代码,但这是我已经陷入的情况,我只想要最简单/最安全的方法来使它工作。

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

3 个答案:

答案 0 :(得分:0)

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

然后您将使用FTP中的最新版本,并且在线进行的更改将适用于当前Git历史记录。

但是可以肯定的是,如果你不确定这两个代码库是否有分歧,那么这就是“冒险”程序。但是你无法做到这一点,因为没有在线文件​​历史记录,你就无法进行三向合并(只有两种方式)。

所以,从那里开始。我会逐行检查差异,以确保。如果你对历史的分歧存在疑问,那么手动任务就无法实现。

答案 1 :(得分:0)

尝试git merge -s。

git merge -s ours origin/remote_branch

这解决了任意数量的头,但是合并的结果树始终是当前分支头的树,实际上忽略了来自所有其他分支的所有更改。它旨在用来取代边支的旧发展历史。

答案 2 :(得分: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 repo

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

我们已经完成了。

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

您可以在任何需要的位置投入额外的复杂性(例如为备份创建额外的分支等)。