【问题标题】:GIT clone to external drive for backupGIT 克隆到外部驱动器进行备份
【发布时间】:2010-12-25 15:12:44
【问题描述】:

我们在 Windows 网络中设置了 GIT(使用 msysgit 和 GitExtensions)。我们每个人都有自己的存储库,并且我们推送到我们其中一台服务器上的远程“裸”存储库。都很好。

我正在尝试在服务器上设置一个计划作业,该作业会将存储库从 C 驱动器克隆到外部驱动器(在 F 上) - 使其工作有些困难。我可以在 GIT bash 中相对轻松地做到这一点,但我不确定如何将它保存到一个批处理文件中,然后我可以使用 scehdule。

到目前为止我所拥有的:

rmdir F:\GitClone /s /q
mkdir F:\GitClone
mkdir F:\GitClone\Repo1
CD /D F:\GitClone\Repo1\
GIT CLONE /c/GIT/Repo1/

我还在最后一行尝试了以下内容:

GIT CLONE C:\GIT\Repo1\

但这也不起作用......我有点难过,希望能得到一些帮助。 C 驱动器包含我们的裸存储库,而 F 驱动器是我们每天更换的外部驱动器...


这里有几个非常有用的答案,谢谢。我得到的答案可能是这些的组合,因此需要指出如何运行 bash 脚本以及如何编写拉/推脚本。

需要将这些组合在一起才能工作,以便在换入和换出各种驱动器时感到高兴(即,如果外部驱动器上不存在存储库,则克隆存储库,否则仅提取差异),但这应该是可行的。谢谢大家。

【问题讨论】:

    标签: windows git backup


    【解决方案1】:

    请注意,git 本身非常擅长仅将所需的更改复制到克隆的存储库。

    如果您希望定期更新您的存储库副本,请执行以下操作:创建一个裸存储库作为备份存储库,然后将所有新更改重复推送到那里(无需删除旧备份)。

    好的,让我们从创建你的 repo 开始

    $ cd /tmp
    $ mkdir myrepo && cd myrepo
    $ touch hi && git add . && git commit -m "bla" 
    

    所以,这是您的存储库。现在我们创建克隆:

    $ cd /tmp
    $ mkdir backup && cd backup 
    $ git --bare init
    Initialized empty Git repository in /tmp/backup/
    

    现在,让我们设置您的存储库以进行定期备份……

    $ cd /tmp/myrepo
    $ git remote add backup /tmp/backup
    $ git config remote.backup.mirror true
    

    然后将所有内容复制到备份中:

    $ git push backup
    Counting objects: 3, done.
    Writing objects: 100% (3/3), 206 bytes, done.
    Total 3 (delta 0), reused 0 (delta 0)
    Unpacking objects: 100% (3/3), done.
    To /tmp/backup
     * °new branch§      master -> master
    

    看看它是否有效:

    $ cd /tmp/backup
    $ git log
    commit d027b125166ff3a5be2d7f7416893a012f218f82
    Author: Niko Schwarz <niko.schwarzàgmail.com>
    Date:   Fri Dec 11 12:24:03 2009 +0100
    
        hi
    

    多田,你准备好了。因此,您的脚本需要做的就是发出git push backup。完全没有必要反复丢弃旧备份。

    另一种选择是您可以让rsync 为您完成所有工作:

    rsync -av rsync://rsync.samba.org/ftp/unpacked/rsync /dest/dir/
    

    User Offby 添加:从版本 1.5.4 开始,“git remote add”采用“--mirror”选项,这使你们都不必“git config remote.origin.mirror true” ",而不必通过 --mirror 到 "git push"。

    【讨论】:

    • 为什么要从一个裸仓库进行 rsync?它将没有签出的文件。如果您 --exclude=.git/,那么您基本上不会复制任何内容。另外,为什么您的存储库会推送到备份?为什么备份不从 repo 中提取?
    • 我不是,我提出了两种不同的方法:rsync,或者复制到一个裸仓库进行复制。在我看来,推送备份比拉取备份更自然。
    • 啊,现在我明白你的意思了,对不起,排除语句误入了。
    • +1:一个裸仓库就是你备份所需要/想要的。但是,您可能实际上想要执行“git push --mirror origin”而不是“git push origin master”来确保备份所有分支。或者确实只是设置“git config remote.origin.mirror true”,然后设置“git push origin”。并且可能调用远程“备份”而不是“原点”;)
    • 从 1.5.4 版开始,“git remote add”采用“--mirror”选项,这使您不必“git config remote.origin.mirror true”,也不必将 --mirror 传递给“git push”。
    【解决方案2】:

    因为git 命令有点奇怪,你必须使用call 从批处理文件中执行任何 git 命令:

    rmdir F:\GitClone /s /q
    mkdir F:\GitClone
    CD /D F:\GitClone\
    call GIT CLONE c/GIT/Repo1/
    

    【讨论】:

      【解决方案3】:

      你总是可以只安排 bash.exe mybashbackupscript.sh

      无论如何,在 Windows 术语中:

      rmdir F:\GitClone /s /q
      mkdir -p F:\GitClone\Repo1
      copy c:\GIT\Repo1\.git F:\GitClone\Repo1\.git
      

      git clone 并没有做任何比这更精彩的事情。

      编辑:正如其他人指出的那样,最好只创建一个新的备份存储库,然后将其拉入/获取。您将避免 .git 的任何访问问题 :)

      【讨论】:

      • 那是我此刻的想法。
      【解决方案4】:

      抱歉,我不能评论帖子,但我也在考虑复制 .git,但是如果 .git 在拉取期间被复制会怎样?

      无论如何,为什么要复制整个内容,因为您可以不时获取增量?

      初始化备份:(在 F:\GitClone\Repo1 为空)

      git init
      git add remote origin /c/GIT/Repo1
      

      那么你的“增量备份脚本”就可以了:

      cd /f/GitClone/Repo1
      git fetch origin
      

      【讨论】:

        【解决方案5】:

        为什么总是删除克隆?当您只想复制文件时,克隆现有存储库有什么意义?

        只需在外部驱动器上创建存储库(使用git clone一次),然后定期在其上运行git pull。

        【讨论】:

        • 这些驱动器每天都会被换入和换出 - 如果还没有,我想确保它被创建。
        【解决方案6】:

        问题解决了:

        h: (flash drive)
        cd \
        mkdir YourProject
        cd YourProject
        git init
        git remote add origin git@github.com:user/YourProject.git
        git remote add local C:\w\YourProject
        git pull origin master
        git push local master
        

        【讨论】:

          猜你喜欢
          • 2020-12-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-10-15
          • 2018-12-28
          • 2018-05-24
          • 2020-09-26
          • 2016-11-20
          相关资源
          最近更新 更多