在一个本地目录中克隆多个git存储库?

时间:2013-09-19 16:33:06

标签: git repository git-clone

是否可以使用一个命令git clone多个git存储库(例如:git clone "1.git,2.git,3.git.."在一个本地目录中?

11 个答案:

答案 0 :(得分:8)

您可以找到像this one这样的脚本示例:

  

我有一个名为“clone”的文件,其中包含几个git repos的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
  

显然,一次克隆多个repos更加困难(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 <tim@tabdeveloper.com>
# 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
GITHUB_PREFIX=git@github.com:
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,这是一个python脚本,其中包括使用最快和并行克隆处理功能进行克隆。

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

答案 1 :(得分:6)

这就是我自己几乎解决的问题:

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

使用Sublime或VSCode等代码编辑器更容易构建。

对我来说唯一的缺点是:如果你没有存储你的凭据,你将不得不一遍又一遍地输入它。

答案 2 :(得分:2)

我为我的项目创建了一个示例脚本。我们的项目包括许多存储库,当一个新人加入团队时需要克隆这些存储库。

所以这是脚本的内容,您可以将其保存到一些可执行文件中并执行。

#include <chrono>

class TemporalAlarmDelay
{
public:
    explicit TemporalAlarmDelay(std::chrono::steady_clock::duration delay)
        : mDelay(delay)
    {

    }

private:
    std::chrono::steady_clock::duration   mDelay;
    std::chrono::steady_clock::time_point mTriggerTime;
};


int main()
{
    using namespace std::chrono_literals;
    TemporalAlarmDelay nanosecondDelay{1ns};   // this works
    TemporalAlarmDelay millisecondDelay{1ms};  // this works
    TemporalAlarmDelay secondDelay{1s};        // this works
    TemporalAlarmDelay failDelay{1};           // compile-time error
}

它安静有用,可以避免无聊的手动操作,并确保一次性克隆所有必需的项目。

希望我的回答能帮助别人。

答案 3 :(得分:1)

如果使用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控制台。 第一次会询问用户名和密码,但之后会记住它。

答案 4 :(得分:1)

嗨,假设您想通过 ssh 而不是 https 执行此操作,并且您已设置了 ssh 密钥。此外,您可能在同一组织中有多个存储库,您可以在 bash 中使用 for。

firebase.json

确保在列表中你有一个包含所有存储库的文件的路径,基本上你得到:

git clone git@github.com:/myrepo.com/folder1

git clone git@github.com:/myrepo.com/folder2

答案 5 :(得分:0)

您可以使用多种解决方案。

使用git的credential.helper设置缓存超时(请参见this),然后可以使用Fábio建议的脚本/列表。这样,您只需要键入一次凭据(通常,除非克隆花费的时间长于缓存超时)。

stdout

这仍然是顺序的,但是它很有帮助,非常简单,恕我直言。

答案 6 :(得分:0)

在阅读本文章和其他文章之后,我以这个脚本结束了。

我需要在本地环境中对存储库进行身份验证。

因此,如果您想记住存储库中的凭据,该脚本将询问您用户,密码和选项。

出于安全原因,我从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的调用以指向您的存储库,这些存储库是伪造的。

关于并感谢其他人的回答。

答案 7 :(得分:0)

如果所有存储库都托管在相同的名称空间(用户名)下,则可以执行以下操作:

$ 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的公共部分保留在最后一部分。

答案 8 :(得分:0)

我遇到了同样的问题,我写了这个简单的bash来实现

type A = { a: "common" } & XOR<{ m: any }, { n: any }>

答案 9 :(得分:0)

如果要从一个目录克隆许多存储库,这是一个很好的解决方案

eval $(printf "git clone \"%s\" & " <git_repo_directory>/*)

其中<git_repo_directory>必须替换为包含git存储库的路径

答案 10 :(得分:0)

这是一个简单的 cmd 版本:

@echo off
SET repos=1.git,2.git,3.git,4.git
SET baseUrl=https://BaseUrl.Company.Com/Project/Whatever/

FOR %%r IN (%repos%) DO (
    git clone %baseUrl%%%r
)

或者,您还可以在 bat 文件中设置用户名/密码,或者使用 SET /p username="Username : " 等要求用户输入