如何使用bundle创建git存储库备份,克隆后没有链接

时间:2018-01-21 20:30:52

标签: git

有没有办法使用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文件的链接。谢谢你的帮助。

1 个答案:

答案 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的相等性,它们应该是相同的。