【问题标题】:Git "force push" from new local repo to remote, but keeping remote commit historyGit“强制推送”从新的本地仓库到远程,但保留远程提交历史
【发布时间】:2013-11-25 07:50:23
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

    标签: git version-control git-push


    【解决方案1】:

    我认为这应该很容易通过.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 将显示分支中的所有提交。

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

    【讨论】:

      【解决方案2】:

      试试 git merge -s。

      git merge -s ours origin/remote_branch
      

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

      【讨论】:

      • 我无法编辑此答案,因为建议的编辑队列已满。但是,这对我有用。从 Git 2.9 开始的正确命令:git merge -s ours --allow-unrelated-histories origin/remote_branch。它从服务器获取整个提交历史,这太棒了。这是详细的线程:stackoverflow.com/a/37938036/1603399
      【解决方案3】:

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

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

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

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

      【讨论】:

        猜你喜欢
        • 2018-12-14
        • 1970-01-01
        • 2013-02-21
        • 2017-04-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多