使用TortoiseGit拉动git子模块

时间:2013-04-17 11:32:46

标签: git tortoisegit

我正在使用TortoiseGit来维护git存储库。我们有一个repo,每个repo有多个子模块。一切正常,但当我试图拉主要回购时,子模块没有更新。我必须逐个拉出每个子模块。

togise中是否有一个选项,只使用菜单中的一个pull命令来更新repo的所有子模块中的所有更改?

3 个答案:

答案 0 :(得分:26)

(git 1.8.2或更高版本)

  1. git pull

  2. git submodule update --merge --remote

  3. 以下是TortoiseGit执行任务的相应屏幕。

    enter image description here

    enter image description here

    enter image description here

答案 1 :(得分: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,而不是使用以下命令检入父repo:

gitpullallhead.sh:

git submodule foreach git pull origin master

这是他们的所作所为:

当其他人通过TortoiseGit将您的项目拉下来时,他们将比需要拉动所有子模块更糟糕 - 他们甚至不会配置这些子模块。更糟糕的是,如果他们试图设置它们:

  1. TortoiseGit只会妨碍他们 - 它还没有任何东西可以解决这个问题。
  2. 他们将使用命令行,它会将每个子模块指向其回购,但不会将其与您的Tortoise / PuTTY键关联,就像普通的Pull一样。
  3. 所以,如果他们只是运行gitsetup.sh,它会处理所有这些 - 它设置每个子模块,拉动它,甚至将特殊的.ppk(PuTTY键)配置设置插入到每个子模块中。适用于任何项目 - 无需每次都进行调整。

    gitpullall.sh正是你所想的,它会带来所有东西。

    所以,不是严格意义上的TortoiseGit解决方案(不存在),但仍然足够方便。

    正如这些剧本中的评论可能证明的那样,我不是Bash的专业人士,并且明显地将他们一起攻击。我欢迎有关改进的建议,特别是在最明显的地方。但我向您保证,他们不仅可以工作,还可以在我们的多个项目中工作,并在多个目录级别存储大量子模块。

    旧答案:

    类似的东西:

    for module in a b c d; do cd $module; git pull; cd..; done
    

答案 2 :(得分:1)

我还能够右键单击作为子模块的文件夹,并在该文件夹上执行正常的Git Pull。

这只拉动了子模块 - 比单个子模块上面的(无可否认的)答案稍微简单一些。