有没有办法使用git bundle
创建备份,其中从备份克隆后没有与捆绑文件的链接?我想将我的存储库备份到包含所有历史记录的单个文件中,并在以后完全恢复它们。
目前,我正在使用以下方法创建备份:
$ mkdir here
$ cd here
$ git init
Initialized empty Git repository in /tmp/here/.git/
$ touch stuff
$ git add stuff
$ git commit -m "This is a file"
[master (root-commit) c867bcf] This is a file
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 stuff
$ git bundle create myrepo.bundle --all
Counting objects: 3, done.
Writing objects: 100% (3/3), 212 bytes | 212.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0)
好的,所以此时我们有一个包含简单存储库的包。现在,当我们尝试从捆绑包中复制此存储库时:
$ cd ..
$ mkdir there
$ cd there
/tmp/there $ git clone ../here/myrepo.bundle .
Cloning into '.'...
Receiving objects: 100% (3/3), done.
/tmp/there $ git remote -v
origin→ /tmp/there/../here/myrepo.bundle (fetch)
origin→ /tmp/there/../here/myrepo.bundle (push)
这表明我们有一个原始包文件的链接,这是我不想要的。我也尝试创建一个镜像,但问题仍然存在:
$ cd ..
$ mkdir there
$ cd there
$ git clone --mirror ../here/myrepo.bundle ./.git
Cloning into bare repository './.git'...
Receiving objects: 100% (3/3), done.
$ git config --bool core.bare false
$ git reset --hard HEAD
HEAD is now at c867bcf This is a file
/tmp/there $ git remote -v
origin→ /tmp/there/../here/myrepo.bundle (fetch)
origin→ /tmp/there/../here/myrepo.bundle (push)
虽然我们可以按原样复制整个存储库,但我真的只想备份一个只包含当前正在修改的文件的文件。我一直在备份目录,这导致了所有剩余文件的混乱。因此,我真的只想归档一个文件,这就是我使用bundle的原因,而且我希望从备份恢复是干净的,因为根本没有与bundle文件的链接。谢谢你的帮助。
答案 0 :(得分:3)
不是从bundle中克隆,而是使用通配符refspec创建一个新的存储库并获取。我在示例中添加了第二个分支feature
和一个标记v1.0
,以使其更具说明性:
$ mkdir there
$ git init .
$ git fetch --update-head-ok ../here/myrepo.bundle '*:*'
Receiving objects: 100% (5/5), done.
From ../here/myrepo.bundle
* [new tag] v1.0 -> v1.0
* [new branch] master -> master
* [new branch] feature -> feature
$ git checkout
*:*
refspec会将所有远程引用提取到同名的本地引用中,如果它们不存在则创建它们。需要--update-head-ok
参数,因为git init
将创建一个master
分支,该分支可能也存在于遥控器中。
由于这是使用直接URL的提取,因此根本不需要遥控器。请注意,这对于任何类型的源repo URL都同样有效,而不仅仅适用于bundle。
可以通过比较两个存储库中git show-ref
的输出来检查旧存储库和新存储库的ref的相等性,它们应该是相同的。