我有一个git子模块(RestKit),我已经添加到我的repo。

我不小心更改了里面的一些文件,我想回到原始版本。为了做到这一点,我试着逃跑

Mac:app-ios user$ git submodule update RestKit

但正如你在这里看到的,这并没有起作用,因为它仍然是“修改的内容”:

Mac:app-ios user$ git status
...
#   modified:   RestKit (modified content)

甚至

Mac:app-ios user$ git submodule update -f RestKit 

不恢复本地修改的文件。 如何重置该子模块的内容?


当前回答

如果您希望为所有子模块执行此操作,而不必更改目录,则可以执行

git submodule foreach git reset --hard

你也可以使用递归标志应用到所有子模块:

git submodule foreach --recursive git reset --hard

其他回答

移动到子模块的目录,然后执行git重置——很难将所有修改过的文件重置到它们上一次提交的状态。请注意,这将丢弃所有未提交的更改。

对于git <= 2.13,这两个命令结合起来应该用递归子模块重置你的repo:

git submodule foreach --recursive git reset --hard
git submodule update --recursive --init

这对我来说是有效的,包括递归到子模块中(也许这就是为什么你的-f不起作用,因为你在子模块中改变了一个子模块):

git submodule update -f --recursive

很简单:

cd /path/to/submodule/root
git submodule update -f --init  .

大多数答案都建议重置所有的子模块,我认为这不是最好的方法,因为它们可能会有合法的变化。

这适用于运行GIT v1.7.1的库,其中我们有一个DEV包回收和LIVE包回收。存储库本身只不过是一个为项目打包资产的外壳。所有子。

LIVE从不被故意更新,但是缓存文件或意外可能发生,使repo变得脏。添加到DEV的新子模块也必须在LIVE中初始化。

DEV中的包存储库

在这里,我们希望获取我们还没有意识到的所有上游更改,然后更新我们的包存储库。

# Recursively reset to the last HEAD
git submodule foreach --recursive git reset --hard

# Recursively cleanup all files and directories
git submodule foreach --recursive git clean -fd

# Recursively pull the upstream master
git submodule foreach --recursive git pull origin master

# Add / Commit / Push all updates to the package repo
git add .
git commit -m "Updates submodules"
git push   

LIVE中的包存储库

在这里,我们希望提取提交给DEV存储库的更改,而不是未知的上游更改。

# Pull changes
git pull

# Pull status (this is required for the submodule update to work)
git status

# Initialize / Update 
git submodule update --init --recursive