使用TortoiseGit拉取git子模块

22

我正在使用TortoiseGit来维护git仓库。我们有一个repo,其中每个子模块都有多个。一切运作良好,但当我尝试拉取主仓库时,子模块没有更新。我必须一个一个地拉取每个子模块。

在tortoise中是否有选项可以只使用菜单中的一个拉取命令,以更新所有子模块中的所有更改?


2
你是在询问自动“更新”还是自动“拉取”子模块吗? - Fantastory
3个回答

37

(Git 1.8.2 或更高版本)

  1. 执行git pull

  2. 执行git submodule update --merge --remote

以下是TortoiseGit对应的操作截图。

在此输入图片描述

在此输入图片描述

在此输入图片描述


为了我的参考,提交,忽略,推送 - Peter PitLock
“Remote tracking branch”选项是执行分支检出的选项吗? - tzg

2

更新

现在在TortoiseGit中有一种方法可以实现此操作,其他答案已经涵盖;下面的旧脚本方法可用于自动化脚本。

旧编辑

目前在TortoiseGit中没有直接完成此操作的方法,但我发现作者非常乐意接受好的想法,如果您将它们作为明确的功能请求提交。以下是我处理此问题的方法:

在每个带有子模块的新项目中,我将以下2个脚本转储到根目录中:

gitsetup.sh

#!/bin/bash
# git built-in
echo "Setting up submodules"
git submodule update --init

echo "Setting up submodules for TortoiseGit/Putty"
# 1) Find the puttykeyfile line, like
#         puttykeyfile = C:\\Users...\\.ssh\\PuTTY.ppk
# 
# in .git/config

# pass to sed to double-escape all backslashes (Windows problem) - that way
# it doesn't become an issue when we use it in sed
puttyline="$(grep puttykeyfile .git/config | sed 's/\\/\\\\/g')"

# 2) Search for .git/modules/*/config

files=$(find .git/modules -type f -name config)

# 3) Find [remote "origin"] 
# 4) Insert line (entire puttykeyfile line we picked up earlier)

echo 'Inserting missing TortoiseGit .ppk into submodules:'

for file in $files
do
    # -q says don't print the grep results, just return 0 or 1
    if grep -q putty $file
    then
        # I have no idea how to just say if not grep, so screw it here's an empty then
        /dev/null
    else
        echo $file
        # -i means overwrite the file rather than printing the result to
        # stdout
        sed -i "s/\(\[remote .origin.\]\)/\1\n$puttyline/" $file
    fi
done

gitpullall.sh

#!/bin/bash -v
git pull --recurse-submodules
git submodule update --recursive

如果您希望获取子模块上的HEAD,而不是父存储库检入的提交:

gitpullallhead.sh:

git submodule foreach git pull origin master

以下是它们的作用:
当其他人通过TortoiseGit下载您的项目时,他们将不仅需要拉取所有子模块,而且甚至没有这些子模块的配置。更糟糕的是,如果他们试图设置它们: 1. TortoiseGit只会妨碍他们——它实际上还没有任何解决此问题的东西。 2. 他们将使用命令行,该命令行将使每个子模块指向其存储库,但不像普通Pull那样将其与您的Tortoise/PuTTY密钥关联起来。
因此,如果他们只运行gitsetup.sh,它会处理所有这些 - 设置每个子模块,拉取它,甚至将特殊的.ppk(PuTTY密钥)配置设置插入到每个子模块中。适用于任何项目-无需每次进行调整。
gitpullall.sh正如您所想,它会去获取一切。
因此,虽然不是严格的TortoiseGit解决方案(不存在),但仍然足够方便。
正如这些脚本中的评论所表明的那样,我不是Bash专业人员,显然是把它们拼凑在一起的。我欢迎改进建议,尤其是在最明显的地方。但我向您保证,它们不仅有效,而且可以跨多个存储在几个目录层次结构中的子模块工作。
旧答案: 类似于:
for module in a b c d; do cd $module; git pull; cd..; done

这个回答对于git shell / CMD是正确的 - 但我相信OP特别询问的是关于Tortoise的(我也很感兴趣)。 - Obmerk Kronen

2

我还可以右键点击子模块所在的文件夹,并在该文件夹上执行常规的Git Pull操作。

这只拉取了子模块 - 所以相对于上面的答案来说稍微简单一些(尽管那个答案也很好用)。


1
是的,但这样你必须为每个子模块单独执行此操作。 现在(2022年),在Tortoise文件夹上下文菜单中有一个“submodule update”命令。 - user3917391
git submodule update会获取正确的索引,而git pull会获取最新的。这不是一样的。 - Adrian Maire

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接