web-dev-qa-db-ja.com

1つのローカルディレクトリに複数のgitリポジトリを複製しますか?

git clone 1つのコマンドで複数のgitリポジトリ(例:git clone "1.git,2.git,3.git.." 1つのローカルディレクトリにありますか?

17
vir2al

this one のようなスクリプト例を見つけることができます:

私はいくつかのgitリポジトリのURLを含む「クローン」と呼ばれるこのファイルを持っています( djangosites.com から取得しました。素晴らしいサイトです。必ずアクセスしてください)

スニペット:

$ cat clone
https://github.com/igorsobreira/igorsobreira.com https://github.com/ella/ella https://github.com/divio/Django-cms/ https://github.com/palewire/palewire.com https://github.com/jabapyth/jfcom https://github.com/humanfromearth/snippify https://github.com/scaphilo/koalixcrm https://github.com/jlev/Boycott-Toolkit https://github.com/jbalogh/zamboni/ https://github.com/ASKBOT/askbot-devel https://github.com/emesik/djiki https://github.com/vicalloy/LBForum https://github.com/agiliq/agiliq https://github.com/bartTC/dpaste.de https://github.com/bartTC/Django-paste https://github.com/bartTC/dpaste_de/ https://github.com/fotochest/fotochest https://esp.mit.edu/git/esp-project.git https://github.com/titan2x/bashoneliners.git

どうやら、一度に複数のリポジトリを複製するのは難しい(git clone <repo1> <repo2> ... <repon> 動作しません)。だから私はそれを機能させるためにこの短いbashコードを書きました:

コード:

atm in /home/atm/git/Django_repos
$ for f in `cat clone`; do `git clone $f`; done 

Gist.github.com には、 this one のように、GitHubからすべてのリポジトリを複製するための多くのものが見つかります。

#!/bin/bash
#
# Copyright 2011, Tim Branyen @tbranyen <[email protected]>
# Dual licensed under the MIT and GPL licenses.
#
# Automatically clone single or multiple repos into a folder, 
# great for setting up a git projects folder.
#
# Install: curl https://Gist.github.com/raw/902154/github.sh > /usr/local/bin/gh
#          chmod +x /usr/local/bin/gh
#

# Internal properties
[email protected]:
GITHUB_USERNAME=$(git config --global github.user)

function main {
  # Improperly configured user
  detect_user

  # Missing arguments
  args=$1
  if [ -z $args ]; then
    echo '
      gh: try ''`gh --help`'' for more information
    '
    exit
  fi

  # Display help text
  if [ $args = '--help' ]; then
    echo '
      Clone repos from your GitHub
        gh repo1 repo2

      Clone repos from others GitHub
        gh username/repo1 username/repo2

      Clone mixed repos:
        gh repo1 username/repo2

      Clone line separated repos from file:
        cat file | xargs gh
    '
    exit
  fi

  # Parse arguments and clone repos.
  find_repos
}

function detect_user {
  # If no username configured, attempt to pull from git --config
  if [ -n "$GITHUB_USERNAME" ]; then
    USERNAME=$GITHUB_USERNAME
  else
    echo '
      gh: missing username
      configure username with ''`git config --global github.user username`''
    '
    exit
  fi
}

function find_repos {
  for repo in $args; do
    # If a user provides the parameter username/repo pull in that specific repository.
    if [ `awk -v repo="$repo" -v delimit="/" 'BEGIN{print index(repo,delimit)}'` -ne 0 ]; then
      echo "Pulling in $repo";
      git clone $GITHUB_PREFIX$repo.git

    # Default to you.
    else
      echo "Pulling in $USERNAME/$repo";
      git clone $GITHUB_PREFIX$USERNAME/$repo.git
    fi
  done
}

main $*

より一般的には、スクリプトによるアプローチが必要であり、 lilgeek が言及されています bl4ckbo7/agt 、a pythonスクリプトには、最速の並列クローン処理機能を使用したクローン作成が含まれています。

https://raw.githubusercontent.com/bl4ckbo7/agt/master/screenshots/agt_clone1.png

10
VonC

これは私にとってほとんど解決された方法です:

git clone https://myrepo.com/folder.git && \
git clone https://myrepo.com/folder2.git && \
git clone https://myrepo.com/folder3.git

これは、SublimeやVSCodeなどのコードエディタを使用して構築する方がはるかに簡単です。

私の唯一の欠点:資格情報を保存しなかった場合は、何度も入力する必要があります。

9
Fábio Correia

プロジェクトのサンプルスクリプトを作成しました。私たちのプロジェクトには、新しい人がチームに加わったときに複製する必要があるリポジトリがたくさん含まれています。

これがスクリプトの内容です。いくつかの実行可能ファイルに保存して実行できます。

   echo -n Please Enter your GitHub Username:
        read username
        echo -n Please Enter your GitHub Password
        read -s password // doesn't echoes the password on screen
        git clone 

https://$username:[email protected]/location/reponame1.git
https://$username:[email protected]/location/reponame2.git
....
https://$username:[email protected]/location/reponamen.git

手間のかかる退屈な作業を避け、必要なすべてのプロジェクトを一度に複製できるようにするための静かな機能です。

私の答えが他の人にも役立つことを願っています。

3
Sanjay Bharwani

すべてのリポジトリが同じ名前空間(ユーザー名)でホストされている場合は、次の操作を実行できます。

$ echo name1 name2 name3 | xargs -n1 | xargs -I{} git clone https://github.com/username/{}

説明

  1. 最初の部分は、スペースで区切られた名前を複数の行に分割します

    $ echo name1 name2 name3 | xargs -n1
    name1
    name2
    name3
    
  2. 次に、これらの名前のそれぞれが次のxargs呼び出しに個別に渡されます。これにより、git cloneが呼び出され、URLの{}サブストリングがリポジトリ名に置き換えられます。

    $ git clone https://github.com/username/name1
    $ git clone https://github.com/username/name2
    $ git clone https://github.com/username/name3
    

すべてのリポジトリが同じ名前空間でホストされていない場合は、動的部分をecho部分に移動し、URLの共通部分を最後の部分に残すことができます。

2

ソリューションを組み合わせて使用​​できます。

Gitのcredential.helperを使用してキャッシュタイムアウトを設定し( this を参照)、- Fábio で提案されているようなスクリプト/リストを使用できます。この方法では、資格情報を入力する必要があるのは1回だけです(通常、クローンがキャッシュタイムアウトより長くかかる場合を除きます)。

git config --global credential.helper 'cache timeout 3600'
git clone https://[email protected]/myproject/myrepo.git
### password should be prompted 
git clone https://[email protected]/myproject/mysecondrepo.git
### look ma, no password Prompt!
git clone https://[email protected]/myproject/mythirdrepo.git
git clone https://[email protected]/myproject/myfourthrepo.git
git clone https://[email protected]/myproject/andsoforthrepo.git

それはまだシーケンシャルですが、それは助けとなり、かなりシンプルです、IMHO。

1
Renato Back

これと他の投稿を読んだ後、私はこのスクリプトで終わりました。

リポジトリ用のローカル環境で認証が必要でした。

そのため、スクリプトは、リポジトリの資格情報を覚えておきたい場合に備えて、ユーザー、パスワード、オプションを尋ねてきます。

セキュリティ上の理由から、gitの構成ファイルからユーザーとパスワードを消去しています。 (これらの資格情報が別の場所に保存されているかどうかは不明です)

#!/bin/bash
#
#This script is intended to be used with repositories that need authentication
#

#Funtion to erase the $username:$password@ from the config file from git in the repo
function erase_user_pass() {
  printf "${green}lets clean $1 from $2 \n${normal}"
  sed -i 's/'"$1"'/'""'/g' $2
}

#function to download the repo
#1-clone the repo
#2-fix the config file by deleting the user and password
#3-execute the git command to automatically store the credentials if the user answer yes on the startup
#
# param 1 = name of the repo
# param 2 = string to complet the url of the repo
#
# example repo in https://git.something.com/yourcompany/your.project.git
#
# the param1 should be your.project
# the param2 should be git.something.com/yourcompany/your.project.git (without 'https://')
#
# download_repo 'your.project' 'git.something.com/yourcompany/your.project.git'
#
function download_repo() {
  path=$(pwd)
  printf "${blue}\n Importing $1\n\n${normal}"
  git clone https://$username:$password@$2
  file="$(pwd)/$1/.git/config"
  replace_string="$username:$password@"
  erase_user_pass $replace_string $file
  cd ./$1
  if [ "$STORE_OK" == 'Yes' ]
    then
     printf "${green} store credentials for the repo $1  \n${normal}"
     git config credential.helper store
  fi
  cd $path
}

blue=$(tput setaf 4)
green=$(tput setaf 2)
normal=$(tput sgr0)

echo -n Please Enter your GitHub Username:
read username
echo -n Please Enter your GitHub Password:
read -s password

printf "\n\nDo you want to store your credentials locally?:"
STORE_OK=
select STORE_OK in Yes No
do
  case $STORE_OK in
    '') echo 'Please enter 1 for Yes, or 2 for No.';;
    ?*) break
  esac
done

printf "${blue}\n\n lets import your repos\n\n${normal}"

# repo 1 https://git.something.com/yourcompany/your.project.git
download_repo 'your.project' 'git.something.com/yourcompany/your.project.git'
# repo 2 https://git.something.com/yourcompany/your.project2.git
download_repo 'your.project2' 'git.something.com/yourcompany/your.project2.git'

printf "${blue}\n Enjoy :)"

exit 0

リポジトリを指すようにdownload_repoの呼び出しを置き換える必要があります。これらは偽物です。

よろしくと他の回答に感謝します。

0
Juano7894

Windowsを使用している場合は、Powershellを使用できます。

次のように、お気に入りのテキストエディタでリストを作成するだけです。

git clone https://github.com/1.git;
git clone https://github.com/2.git;
git clone https://github.com/3.git;
git clone https://github.com/4.git;
git clone https://github.com/5.git;

PowerShellコンソールで、ディレクトリに移動します。

cd d:/myGitRepos

次に、リポジトリリストを直接コピーして、PowerShellコンソールを実行します。初回はユーザー名とパスワードを要求しますが、その後はそれを記憶します。

0
Priit Paris