我想将本地存储库与远程存储库同步,以便本地存储库成为远程存储库的100%副本——这意味着如果这些存储库中的某些文件不同,我们将用远程存储库覆盖本地存储库,如果本地存储库中的文件在远程存储库中不存在,则本地文件将被删除。
除了重新克隆远程存储库之外,还有什么方法可以实现这一点吗?
类似的问题是一次性将本地git回购与远程同步,丢弃本地更改/提交。
我想将本地存储库与远程存储库同步,以便本地存储库成为远程存储库的100%副本——这意味着如果这些存储库中的某些文件不同,我们将用远程存储库覆盖本地存储库,如果本地存储库中的文件在远程存储库中不存在,则本地文件将被删除。
除了重新克隆远程存储库之外,还有什么方法可以实现这一点吗?
类似的问题是一次性将本地git回购与远程同步,丢弃本地更改/提交。
当前回答
听起来好像你想要一个远程存储库的镜像:
git clone --mirror url://to/remote.git local.git
该命令创建一个裸存储库。如果您不想要一个裸露的存储库,事情就会变得更加复杂。
其他回答
重置本地存储库并将其与远程分支同步
命令: 请记住用您想要同步的远程和分支来替换原点和主节点。
git fetch origin && git reset --hard origin/master && git clean -f -d
还是一步一步:
git fetch origin
git reset --hard origin/master
git clean -f -d
您的本地分支现在是远程分支的精确副本(提交和全部)。
命令输出:
下面是在Forge git存储库的本地克隆上运行该命令的示例。
sharkbook:forge lbaxter$ git fetch origin && git reset --hard origin/master && git clean -f -d
HEAD is now at 356cd85 FORGE-680
Removing forge-example-plugin/
Removing plugin-container-api/
Removing plugin-container/
Removing shell/.forge_settings
sharkbook:forge lbaxter$
你可以使用git钩子。只需创建一个钩子,在更新后将更改推到另一个回购。
当然,您可能会遇到合并冲突,因此您必须弄清楚如何处理它们。
这个脚本将检查哪些本地远程不存在于您的远程并将它们从本地删除
git fetch --prune; git branch -vv | egrep -v "(\[origin\/[a-zA-Z0-9/_-]+\])" | awk "{print \$1}" | xargs git branch -D
您需要了解Git存储库不仅仅是目录和文件的树,而且还存储这些树的历史—其中可能包含分支和合并。
当从存储库中获取时,您将把所有或部分分支复制到存储库中。然后在你的存储库中作为“远程跟踪分支”,例如,命名为remotes/origin/master之类的分支。
从远程存储库获取新的提交不会改变本地工作副本的任何内容。
工作副本通常签出一个提交,称为HEAD。这个提交通常是某个本地分支的提示。
我认为您希望将您的本地分支(或者可能是所有本地分支?)更新到相应的远程分支,然后签出最新的分支。
为了避免与工作副本发生冲突(可能有本地更改),首先清理所有没有版本控制的内容(使用git clean)。然后签出与要更新的远程分支对应的本地分支,并使用git reset将其切换到获取的远程分支。(git pull会将远程分支的所有更新合并到本地分支中,如果你有本地提交,也可以创建合并提交。)
(但是这样你就会丢失所有的本地更改——包括工作副本和本地提交。确保你真的想要这个-否则最好使用一个新的分支,这将保存你的本地提交。并使用git stash保存尚未提交的更改。)
编辑: 如果您只有一个本地分支,并且正在跟踪一个远程分支,那么您所需要做的就是
git pull
从工作目录内部。
这将获取所有被跟踪的远程分支的当前版本,并将当前分支(和工作目录)更新到它所跟踪的远程分支的当前版本。
如果你想在远程上创建一个新的分支来镜像和跟踪你的本地分支(反之亦然),永久的修复方法是:
git config --global push.default current
在我克隆git之后,我总是用这个命令配置我的本地git。尽管它可以在本地-远程分支“Git fatal: the current branch has no upstream branch”错误发生时随时应用。