2017-09-16 1 views
1

Ich habe gitolite Setup auf einem meiner Server und es hat viele git-Repositories. Also entschied ich mich, eine Sicherungskopie von all diesen zu nehmen und this über git bundle zu finden. Und basierend auf mich erstellt die unten stehende SkriptWie Backup von Git von einem Server zu einem anderen

#!/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 

In dem obigen Skript 1. i in der gleichen Maschine eine Sicherung des Repository nähme aber in anderen Ordnern wie im Skript backup_base_dir=/home/bean/gitbackup/ erwähnt und dann rsync mit dem Backup-Einnahme in eine andere Maschine/Server. Also meine Frage ist, gibt es eine Möglichkeit, die Sicherung in der gleichen Maschine zu vermeiden, und ich kann direkt auf einen anderen Server/Maschine sichern. Wollte nur die Sicherung in der gleichen Maschine beseitigen und wollte direkt auf Server-Maschine sichern.

Sowohl die Maschinen/Server Ubuntu 16

Antwort

0

Für GitHub sind, das funktioniert:

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 

Um den gleichen Ansatz verfolgen Sie müssen als-as-Dienst eine Liste aller Repositories belichten , hier habe ich etwas Kleines in go erstellt, das Ihnen hoffentlich als Startpunkt helfen könnte:

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)) 
} 

Grundsätzlich wird, scannen Sie alle Verzeichnisse, von wo aus Sie den Code auf dem Server ausführen und versuchen, die git remotes Rückkehr in ein JSON-Format eine Liste aller Fernbedienungen gefunden zu finden.

Von Ihrem Backup-Server später könnten Sie einfach den gleichen Ansatz für Github und Backup ohne Duplizierung verwenden.

In diesem Fall könnten Sie es wie folgt verwendet werden:

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

ich brauchte es für meine 'lokalen git' I' konfiguriert haben gitolite'. –

+0

Sie erwähnt, die von Server A auf Server B sichern wollte, ohne die Notwendigkeit, lokale Faust zu kopieren, die Lösung, die ich vorschlage, ist nur für das Ziehen der Repositorys remote und damit vermeiden Sie lokale Vervielfältigung, Auf jeden Fall mit 'gitolite' könnte einfacher sein da konnte man die config-datei parsen und einfach remote ziehen, aber naja alles ist relativ – nbari

Verwandte Themen