首页 > 解决方案 > 如何将数千个本地版本添加到 GitHub?

问题描述

我有一个包含几千个代码版本的文件夹,每个版本都在自己的子文件夹中。但是,我需要开始使用 GitHub,但我希望将我的整个代码发布集合添加到 GitHub 的发布部分下。最简单的方法是什么?

显然,我无法从现有存储库中导入,因为我没有 - 它只是我计算机上的几千个文件夹。

我不能手动提交和标记每个版本,因为太多了。

我知道,如果我想一次性从 GitHub 中删除多个版本,我可以检出整个存储库,从 Tags 文件夹中删除版本文件夹,然后提交更改。

是否也可以使用类似的技术来添加许多版本?我确实尝试将我计算机上的一些发布文件夹复制到 GitHub 上的 Tags 文件夹,但是当我提交时,GitHub 抱怨发布文件夹已过期并且不会接受它们。

所以我的电脑上有数千个发布文件夹。如何在不使用导入且不单独手动提交每一个的情况下将所有这些上传到我在 GitHub 上的存储库?我只是希望它们都可以在 GitHub 上的 Releases/Tags 类别中使用,但是手动提交的太多了。

标签: gitgithub

解决方案


我假设您有一个看起来像这样的发布文件夹:

myproject-1.0/
myproject-1.1/
myproject-2.0/

等等。您想将这些导入到 git 存储库中。我们首先创建一个空的 git 存储库:

git init myproject

这将创建一个名为的目录myproject,其中包含一个空的 git 存储库。将目录更改为该目录:

cd myproject

现在,要导入您的版本,我们需要按顺序遍历您的版本,并为每个版本执行以下操作。

  1. 将发行版中的所有文件复制到存储库中:

    cp -a ../${release}/* .
    
  2. 将文件添加到存储库:

    git add .
    
  3. 提交文件:

    git commit -m "imported release $release"
    
  4. (可选)标记提交:

    git tag $release
    

    或者要将标签变成 GitHub 版本,创建一个带注释的标签:

    git tag -a -m "imported $release" $release
    

在上述的每次迭代之间,您希望在复制到下一个版本之前删除存储库中的所有文件。


为了对此进行原型制作,我抓取了 GNUhello项目的所有版本并将它们放入一个目录中;这意味着我从这个开始:

$ ls
hello-1.3    hello-2.1.1  hello-2.4  hello-2.7
hello-2.1.0  hello-2.2    hello-2.5  hello-2.8
hello-2.10   hello-2.3    hello-2.6  hello-2.9

我编写了以下脚本来执行导入:

#!/bin/bash

if [ ! -d hello-repo ]; then
    git init hello-repo
fi

# change directory into the repository
cd hello-repo

# iterate over the releases in version order
ls -d ../hello-[0-9]* | sort --version-sort -t- -k2,2 |
while read path; do
  release="${path##*/}"
  echo "importing release: $release"

  rm -rf *
  cp -a $path/* .
  git add .
  git commit -m "imported release $release"
  git tag -a -m "imported $release" "$release"
done

请注意,我正在使用sort --version-sort ...以确保获得按正确顺序列出的目录;没有它,这些目录的词法排序将hello-2.10立即放在hello-2.1.0.

我在这里创建了一个 GitHub 存储库,其中包含运行该脚本的结果,因此您可以查看最终结果。

因为我创建了带注释的标签 ( git tag -a ...),所以每个标签都会自动转换为 GitHub 版本(参见此处)。


推荐阅读