用本地repo替换远程存储库,但保持远程的提交历史记录

时间:2015-10-02 15:46:34

标签: git github

我在Github存储库中存储了一个Android“。现在我完成了对应用程序的完全重写(从另一个存储库中的新内容开始) - (如何)可以将完整的新存储库推送到现有存储库,但保留它的提交历史记录?

我想我不想使用-f标志,因为提交被删除了。最好的情况是拥有两个存储库的完整历史记录,但代码应该只来自新的。

3 个答案:

答案 0 :(得分:3)

这是一种蛮力的方法(假设您正在使用主分支):

转到旧的原始仓库,rm -Rf除.git目录之外的所有内容。然后:

git add -u
git commit -m "starting over"

然后,为当前仓库中的旧仓库定义一个遥控器

git remote add origRepo oldUrl
git fetch origRepo

然后,在当前仓库中创建一个临时分支 并推送您的代码:

git checkout -b tempBranch
git reset --hard origRepo/master
git merge master
git push origRepo tempBranch

然后在原始回购

git fetch
git checkout master
git merge origin/tempBranch
git push origin master

如果不是每个文件都需要更换,你也可以考虑使用我们的/他们的合并策略。

答案 1 :(得分:1)

可以更简单:

列出您现有的遥控器,以获取您想要更改的遥控器的名称。

$ git remote -v

origin  git@github.com:USERNAME/REPOSITORY.git (fetch)
origin  git@github.com:USERNAME/REPOSITORY.git (push)

使用git remote set-url命令将您的远程网址从SSH更改为HTTPS。

$ git remote set-url origin https://github.com/USERNAME/OTHERREPOSITORY.git

验证远程网址是否已更改。

$ git remote -v
# Verify new remote URL
origin  https://github.com/USERNAME/OTHERREPOSITORY.git (fetch)
origin  https://github.com/USERNAME/OTHERREPOSITORY.git (push)

下次git fetch, git pull, or git push到远程存储库时,系统会要求您输入GitHub用户名和密码。

更多信息:

https://help.github.com/articles/changing-a-remote-s-url/

答案 2 :(得分:0)

您可以将完全独立的提交图提交到同一个存储库中。只要有分支指向每个树,远程存储库就会保留两个树。这种方法对于repo的用户来说可能有点混乱,因为每个存储库拥有更多的一个提交树是非常罕见的,但它完全有效地使用了git。

假设您希望遥控器中的master指向新存储库:

# Rename and push your old master
cd oldRepo
git branch old-master master
git push remote old-master

# Push your new master
cd newRepo
git remote add remote url-to-remote
git push --force remote master

在此之后,远程的master将指向新的提交树,旧的树仍然可以通过old-master访问。如果您结帐old-master,您的整个目录结构将被旧内容覆盖,同样如果您结帐master

这两棵树也可以合并为一张图。它看起来像是整个存储库被重写的合并,因为它正是它的本质。如果执行此操作,则会保留两个历史记录,因为它们仍可在提交树中访问:

# Fetch your remote in your new repo
cd newRepo
git remote add old-remote url-to-remote
git fetch old-remote master
# Assuming current branch in newRepo is master
git merge old-remote/master
git push old-remote