2017-09-16 6 views
1

私のサーバーの1台にgitoliteのセットアップがあり、gitリポジトリがたくさんあります。だから私はこれらのすべてのバックアップを取ることを決めたthisgit bundleを見つけた。そして、それに基づいて、バックアップを取ってrsyncを使用して、スクリプトbackup_base_dir=/home/bean/gitbackup/に言及し、と私は同じマシンではなく、別のフォルダにリポジトリのバックアップを取っています上記のスクリプトを第一には、以下のスクリプトあるサーバーから別のサーバーにgitのバックアップを取る方法

#!/bin/bash 
projects_dir=/home/bean/git/ 
backup_base_dir=/home/bean/gitbackup/ 

test -d ${backup_base_dir} || mkdir -p ${backup_base_dir} 
pushd $projects_dir 

for repo in `find $projects_dir -type d -name .git`; do 
    cd $repo/.. 
    this_repo=`basename $PWD` 
    git bundle create ${backup_base_dir}/${this_repo}.bundle --all 
    cd - 
done 
popd 

cd $backup_base_dir 
rsync -r . [email protected]_address:/home/bean1/git_2nd_backup 

を作成しました別のマシン/サーバー。だから私の質問は、同じマシンでのバックアップを避けるための方法はありますか、私は直接別のサーバー/マシンにバックアップすることができます。同じマシンでバックアップを取り除き、サーバーマシンに直接バックアップしたいと考えました。

はGitHubのために、これは動作します両方のマシンが/サーバはUbuntu 16

答えて

0

されています

for repo in $(/usr/local/bin/curl -s -u <username>:<api-key> "https://api.github.com/user/repos?per_page=100&type=owner" | 
    /usr/local/bin/jq -r '.[] | .ssh_url') 
do 
    /usr/local/bin/git clone --mirror ${repo} 
done 

はあなたがサービスとして-として、すべてのリポジトリのリストを公開する必要があります同じアプローチに従ってくださいここで私はgoに小さいものを作成して、うまくいけば始点としてあなたを助けることができました。

https://gist.github.com/nbari/c98225144dcdd8c3c1466f6af733c73a

package main 

import (
    "encoding/json" 
    "fmt" 
    "log" 
    "net/http" 
    "os" 
    "os/exec" 
    "path/filepath" 

    "github.com/nbari/violetear" 
) 

type Repos struct { 
    Remotes []string 
} 

func findRemotes(w http.ResponseWriter, r *http.Request) { 
    files, _ := filepath.Glob("*") 
    repos := &Repos{} 
    for _, f := range files { 
     fi, err := os.Stat(f) 
     if err != nil { 
      fmt.Println(err) 
      continue 
     } 
     if fi.Mode().IsDir() { 
      out, err := exec.Command("git", 
       fmt.Sprintf("--git-dir=%s/.git", f), 
       "remote", 
       "get-url", 
       "--push", 
       "--all", 
       "origin").Output() 
      if err != nil { 
       log.Println(err) 
       continue 
      } 
      if len(out) > 0 { 
       repos.Remotes = append(repos.Remotes, strings.TrimSpace(fmt.Sprintf("%s", out))) 
      } 
     } 
    } 
    if err := json.NewEncoder(w).Encode(repos); err != nil { 
     log.Println(err) 
    } 
} 

func main() { 
    router := violetear.New() 
    router.HandleFunc("*", findRemotes) 
    log.Fatal(http.ListenAndServe(":8080", router)) 
} 

基本的に、あなたは、サーバー上でコードを実行し、そこからすべてのディレクトリをスキャンし、JSON形式で見つかったすべてのリモコンのリストを返すgit remotesを見つけようとします。

後でバックアップサーバーから、Githubとバックアップを重複せずに使用するのと同じ方法を使用できます。この場合

、あなたはこのようにそれを使用することができます:私は `構成しgitolite`ている私の`ローカルgit`のためにそれを必要と

for repo in $(curl -s your-server:8080 | jq -r '.[][]') 
do 
    /usr/local/bin/git clone --mirror ${repo} 
done 
+0

。 –

+0

あなたは、ローカルの拳をコピーする必要はなく、サーバーAからサーバーBにバックアップしたいと述べたが、私が提案する解決策は、リポジトリを遠隔から引き出すためのもので、ローカル複製を避けることだ。 'gitolite 'あなたは設定ファイルを解析してリモートを引っ張ることができるので、しかしすべてが相対的です – nbari

関連する問題