是否可以使用一个命令git clone
多个git存储库(例如:git clone "1.git,2.git,3.git.."
在一个本地目录中?
答案 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脚本,其中包括使用最快和并行克隆处理功能进行克隆。
答案 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/{}
说明
第一部分将用空格分隔的名称分成多行
$ echo name1 name2 name3 | xargs -n1
name1
name2
name3
然后,将每个名称分别传递到下一个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 : "
等要求用户输入