【问题标题】:Is there an easier way to "git init" multiple folders into different repositories?有没有更简单的方法可以将多个文件夹“git init”到不同的存储库中?
【发布时间】:2019-05-23 07:35:57
【问题描述】:

我有大约 50 个本地文件夹,我打算将它们初始化为单独的 git 存储库,托管在 GitHub 上。

我想知道除了在 50 个文件夹中的每个文件夹中单独运行 git init 之外,是否有更简单的方法来初始化多个 Git 存储库。

我已经为 50 的 2 个存储库单独运行了 git init,但这似乎很乏味,我觉得必须有更简单的方法。

更新:

正如this post 所引用的,我会运行以下 bash shell 吗?

cd folder-with-all-folders-to-git-init
for D in `find . -type d`
do
    git init && git add . && git commit -m "Initial commit"
done

【问题讨论】:

  • 使用bash loop?
  • 我可以将它复制/粘贴到 bash shell 中吗?我不确定。
  • @SergioTulentsev 我编辑了我的问题以包含我打算在 bash shell 中运行的内容。我有点紧张,但你认为这真的有用吗?
  • 在运行git init 之前,您需要将(cd "$D"; git init && git add . && git commit -m "Initial commit") 更改为目录。 (…) 表示法在子shell 中运行命令,这意味着您不必担心执行cd 命令后如何返回。
  • “$D”是指包含我想要“git init”的所有文件夹的文件夹吗?

标签: git


【解决方案1】:

大纲命令部分正确,大部分不正确,但可以做得足够正确。

你有:

cd folder-with-all-folders-to-git-init
for D in `find . -type d`
do
    git init && git add . && git commit -m "Initial commit"
done

在运行git init 之前,您至少需要将cd 放入每个目录。应该这样做:

cd folder-with-all-folders-to-git-init
for D in `find . -type d`
do
    (cd "$D" && git init && git add . && git commit -m "Initial commit")
done

这会启动一个子shell,以避免符号链接问题并返回您开始的位置。

不推荐使用反引号;请改用$( … ) 表示法。但是,如果名称中可能存在空格,则从该结果中读取名称也不是一个好主意。你最好用一个'glob'。在尝试执行git init 之前,可能还需要测试是否缺少.git 子目录,尤其是在您必须多次运行脚本的情况下。此外,find 将找到子目录,例如现有的.git 子目录。

这导致:

cd folder-with-all-folders-to-git-init
for D in *
do
    if [ -d "$D" ] && [ ! -d "$D/.git" ]
    then (cd "$D" && git init && git add . && git commit -m "Initial commit")
    fi
done

这是一个相当稳健的问题解决方案。如果您确实想要将嵌套目录构建为独立的 Git 存储库,则需要更加努力,但这可能不是您想要的。

【讨论】:

  • 您可以通过通配*/ 省略检查$D 是否为目录。此外,.git 可能是一个文件。
  • @o11c:是的,这是一个可能的全局替代方案。 Bash 就像 Perl;有不止一种方法可以做到(TMTOWTDI)。是的,.git 可以是文件,也可以是字符设备、套接字、块设备、FIFO 或……但随后git init 将失败并出现适当的错误(或它认为适当的错误),所以其余的子shell中的命令不会被执行,也不会造成任何损害。也不能保证即使 .git 是一个目录,它实际上是一个有效的 Git 存储库。它只是解决了最可能出现的问题(此目录已初始化;其他一些没有)。
  • .git 不能有意义地 成为一个套接字等。不过,将其定义为文本文件是完全明确的,其中包含指向其他目录的配置.
【解决方案2】:

您可以在 Git 中使用 -C 选项,它告诉 Git 将其工作目录切换到另一个。这对于带有特殊字符的目录名称是安全的。

cd folder-with-all-folders-to-git-init
while read -r D; do
  if [ -d "$D/.git" ]; then
    continue # a git repo exists
  fi

  git -C "$D" init &&
  git -C "$D" add -A &&
  git -C "$D" commit -m "Initial commit"
done < <(find . -type d)

【讨论】:

  • 您所拥有的一个小缺点是,如果 3 个命令序列中出现问题,您不会放弃处理。您可以通过在前两个后添加&amp;&amp; 来解决此问题,因此这不是主要问题。
  • 而带有换行符的目录名称现在会引起悲伤......从find 之类的命令读取输出是狡猾的,除非您有理由确定名称从不包含特殊字符。请参阅 Bash Guide 了解“测试和条件”以及 Bash FAQ — 尽管我承认我没有找到确切的常见问题解答问题涵盖这些问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-02
  • 2019-08-14
  • 1970-01-01
  • 1970-01-01
  • 2011-01-18
  • 2013-03-26
相关资源
最近更新 更多