带有所有分支/标签的远程git存储库的完整本地副本

时间:2018-07-18 09:31:49

标签: git

我想知道,您将如何继续制作远程git存储库的完整本地副本,该副本可以在原始存储库中使用。

到目前为止,我发现的所有指南都描述了如何将远程git存储库复制到另一个远程git存储库。

这样的指南是:

How to move a full Git repository

$ git clone https://github.com/Sample/sample.git
$ cd sample.git
$ git checkout remotes/origin/HEAD
$ git checkout remotes/origin/develop
$ git checkout remotes/origin/master
$ git checkout remotes/origin/micros-integration
$ git checkout remotes/origin/release/0.4.8
$ git checkout remotes/origin/release/0.6.0
$ git checkout remotes/origin/remove-keygen
$ git fetch --tags
$ git remote rm origin
$ git remote add origin https://github.com/Target/target.git
$ git push origin --all
$ git push --tags

又一个:

Mirroring a git repository without a local copy

$ git clone --mirror git@github.com/Sample/sample.git
$ cd upstream-repository.git
$ git push --mirror git@github.com/Target/target.git

那么,如何在不链接到原始存储库的情况下继续创建本地副本? 如果只想维护特定的分支并删除其他所有内容,包括所有历史记录(拉请求,代码更改等),应该怎么做?

1 个答案:

答案 0 :(得分:2)

要复制包含所有分支和标签(和其他参考)的仓库,请使用

git clone --mirror <repo-url>

要断开副本与原始副本的链接,请进入cd进入repo目录,然后

git remote remove origin

如果您只想保留分支的子集,则最佳过程取决于具体细节;否则,请执行以下步骤。您也许可以限制克隆的内容,但是确切的操作方法取决于您要保留的内容。

作为一般解决方案,克隆后,您可以从克隆中删除不需要的分支(和其他引用),然后运行gc

git branch -D unwanted-branch
git tag -D unwanted-tag
git gc --aggressive --prune=all

gc不会从任何引用(分支,标签等)或任何引用日志中删除任何可访问的内容,但是新克隆副本不应包含任何引用日志包。您可以通过以下方式验证引用是否存在

git for-each-ref

如果gc给您带来麻烦,另一种选择是克隆克隆

git clone --mirror file://localhost/path/to/first/clone

不应期望它传输不必要的对象。 (但同样,除非您的克隆命令通过--single-branch或浅历史记录选项来限制该复制,否则所有可访问的内容都会被复制。)

无论使用哪种方法,如果一个对象都是可访问的,则将保留该对象,其中可能包括构成已删除分支的提交(例如,如果该分支已合并到您尚未删除的分支中)。因此,如果您有特定的要求将历史记录限制为上述过程所不能完成的范围,则可能需要更复杂的工具(如浅历史记录),并且该过程可能取决于很多细节。

还要注意,拉取请求不是git概念; PR是托管git remoets的环境的发明。您可能有PR产生的合并提交,这些合并提交的处理方式与其他任何历史记录一样。