我在Github存储库中存储了一个Android“。现在我完成了对应用程序的完全重写(从另一个存储库中的新内容开始) - (如何)可以将完整的新存储库推送到现有存储库,但保留它的提交历史记录?
我想我不想使用-f标志,因为提交被删除了。最好的情况是拥有两个存储库的完整历史记录,但代码应该只来自新的。
答案 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用户名和密码。
更多信息:
答案 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