【问题标题】:Clone multiple repositories into common parent folder structure将多个存储库克隆到公共父文件夹结构中
【发布时间】:2020-07-07 16:29:55
【问题描述】:

我的问题是我有一个客户,我们称他们为“Evil Corp”,它通过我们使用 GitHub 存储库的各种项目为我的公司提供大量业务。让我们取 2 并称它们为“TotallyNotPolluting”和“CoveringUpPolluting”。

我希望我的员工能够在克隆时将“TotallyNotPolluting”存储库克隆到文件夹“EvilCorp”中。

行为:

所以起始结构是:

E:
└── Work
    └── Repos
  1. 具有起始文件夹结构:E:\Work\Repos 开始
  2. 在 Git Bash/GitHub Desktop/任何克隆 repo 'TotallyNotPollluting' (选择的位置是起始文件夹结构 E:\Work\Repos
  3. 有结束文件夹结构:E:\Work\Repos\EvilCorp\TotallyNotPolluting
  4. 在 Git Bash/GitHub Desktop/无论克隆 repo 'CoveringUpPolluting' (选择的位置是起始文件夹结构 E:\Work\Repos
  5. 有结束文件夹结构:E:\Work\Repos\EvilCorp\CoveringUpPolluting

所以最终的结构是:

E:
└── Work
    └── Repos
        └── EvilCorp
            ├── TotallyNotPolluting
            └── CoveringUpPolluting

这样,所有存储库都被组织到客户端文件夹中,而无需员工采取额外步骤。

这可能吗?要让克隆操作创建然后克隆到(如果不存在)或克隆到(如果存在)父目录?

注意:我已经研究过使用子模块,但我不想要包含其他存储库的存储库“EvilCorp”。我只想要克隆时的文件夹。

【问题讨论】:

  • 我可能误解了你的问题,但是如果你创建一个顶级仓库“Evil Corp”并在其中创建子文件夹,然后将项目添加到各个文件夹,那么人们将不得不总是克隆“Evil Corp” “回购,他们最终将获得所有其他子项目。但是,不建议将多个不相关的项目保存在一个 repo 中。如果我理解错了,请更正。
  • @prabodhprakash 我在问题的底部添加了一个 NOTE,即我不想要包含其他 repos 的 repo 'EvilCorp'。我只想创建一个文件夹并然后克隆到其中,或者如果该文件夹已经存在直接克隆到其中。
  • 你可以写一个脚本来为你做这件事。一个简单的 shell 脚本,它转到父文件夹并检查单个文件夹(如果存在),检查该文件夹中的 repo - 如果不存在任何内容,请克隆 repo。如果子文件夹不存在,如果首先创建子文件夹然后克隆 repo。因此,您可以在 github 上拥有多个不同的 repos,并在客户端拥有一个可执行的 shell 脚本来管理它们。
  • @prabodhprakash 我将如何在克隆上自动执行此操作?有没有办法将 shell 脚本注入到 Git 进程中进行克隆?如果您知道如何,请将其作为答案提交,如果可行,我会接受。
  • 现在在手机上,早上第一件事就是发送脚本。脚本将做什么 - 创建一个父文件夹(例如:\\work\\repos),然后将创建单独的子文件夹,并在每个子文件夹中克隆一个 repo。如果存在文件夹/子文件夹/repo,它将跳过。另外,我使用的是 mac,所以您必须进行调整才能使其在 Windows 中运行。预期是否正确?

标签: windows git github


【解决方案1】:

您可以编写如下脚本。我没有正确测试它,但这应该给你正确的方向来移动它。这个shell脚本的目的是创建一个父目录,然后单独创建每个子文件夹,检查子文件夹是否为空。如果为空,则克隆 repo。这个 shell 脚本可以作为可执行文件分发给员工,然后在运行时将 repos 克隆到正确的位置。

#create the directory, if it does not exist

directoryName="<your directory name here>"
mkdir -p directoryName
repos="TotallyNotPolluting CoveringUpPolluting"
forwardSlash="/"
#go into directory
pushd $directoryName



for repo in $repos; do

    #check if directory is not present, if true, create the directory

    [ ! -d $repo ] && mkdir -p $repo

    #go into directory

    currentDirectory=$directoryName$forwardSlash$repo
    if [ "$(ls -A $currentDirectory)" ]; then

     echo "directory is not empty, skipping to clone"
    else
        pushd $directoryName$forwardSlash$repo
        git clone "git@$codeHost:$codeUser/$repo.git"
    fi

done

【讨论】:

  • 这不是我想要的完全,但我想它已经足够接近了。理想情况下,解决方案是在创建克隆时运行脚本,而不是在运行脚本时创建克隆。这就是为什么我询问注入脚本以在 repo clone 命令上运行的原因。被选为答案,因为这似乎不太可能。
  • 您可以考虑将其标记为正确答案,如果这指向您的解决方案绝对正确的路径。
【解决方案2】:

有一个只包含子模块的超级项目(如果你真的想让 git 知道 - 虽然根据我的经验它不能很好地工作)。

取而代之的是一个超级项目,其中仅包含一个“检查所有内容”脚本,然后用户可以运行该脚本,该脚本会提供您想要存在的任何存储库。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-13
    • 1970-01-01
    • 2011-11-16
    • 1970-01-01
    • 2023-01-11
    相关资源
    最近更新 更多