2011-10-24 29 views
78

我在我的主git倉庫中有一個git子模塊。據我瞭解,主repo存儲SHA值(某處......),指向子模塊的「鏈接到」的特定提交。如何將Git子模塊指針恢復到存儲在存儲庫中的提交?

我進入我的子模塊並輸入git checkout some_other_branch。我不知道我來自哪個承諾。

我想恢復該指針,使主repo和子模塊再次同步。

我的第一個(可能是天真的)本能是說git reset --hard - 這似乎適用於其他一切。令我驚訝的是,這並不適用於這種情況。

所以我想通了,我可以鍵入git diff,注意子模塊指針曾經有的SHA ID,然後進入子模塊和git checkout [SHA ID] ...但肯定必須有一個更簡單的方法?

由於我還在學習git子模塊,請隨時糾正我的術語,如果有我不知道的概念的話。

回答

112

要更新您的子模塊,因此它在同步什麼父庫認爲它應該是。這是更新的命令是什麼:

從子模塊手冊頁:

 
Update the registered submodules, i.e. clone missing submodules and 
checkout the commit specified in the index of the containing 
repository. This will make the submodules HEAD be detached unless 
--rebase or --merge is specified or the key submodule.$name.update 
is set to rebase or merge. 

運行這一點,就可以成功:

git submodule update 
+2

不知怎的,對我來說,我需要添加'--init'。如果沒有它,子模塊會保持'(新提交)'狀態。即使我的子模塊已經初始化。 – Ambidex

+0

@Ambidex是的'--init'選項在所有這些中都是至關重要的。由於我的子模塊是通過https克隆的,因此係統提示輸入用戶名和密碼。我進入了這兩個文件夾,並設置遙控器使用'ssh'協議進行結賬。 –

14

要更改子模塊指向的提交,您需要在子模塊中籤出該版本,然後返回到包含的回購,添加並提交該更改。

或者,如果您希望子模塊位於頂級回購指向的版本上,請執行git submodule update --recursive。如果您剛剛克隆,請添加--init

另外,沒有子模塊命令的git submodule會向您顯示您指向的提交。如果不同步,提交前會有一個或一個+。

如果您查看其中具有子模塊的樹,可以看到子模塊被標記爲commit,而其他子塊則是斑點或樹。

,看看有什麼特定的提交點WRT到子模塊,您可以:

git ls-tree <some sha1, or branch, etc> Submodule/path 

然後你可以看到提交或其他任何東西,如果你通過傳遞到日誌等(在git-dir選項的混帳喜歡指令級別允許您跳過不必CD到子模塊):

git --git-dir=Submodule/path log -1 $(<the above statement>) 
4

使用git ls-tree HEAD在「上層項目」文件夾以查看你的子模塊最初是什麼提交的。然後轉到子模塊目錄並使用git log --oneline --decorate來查看原始提交所在的分支。最後,git checkout original-commit-branch

使用一些測試目錄,我成立了,這裏的命令可能是什麼樣子:

$ git --version 
git version 1.7.4.1 
$ git status 
# On branch master 
# Changes not staged for commit: 
# (use "git add <file>..." to update what will be committed) 
# (use "git checkout -- <file>..." to discard changes in working directory) 
# 
# modified: sm2 (new commits) 
# 
no changes added to commit (use "git add" and/or "git commit -a") 
$ git ls-tree HEAD 
100644 blob 76813a07ae558db274cefc6d903ec24323fdeb0d .gitmodules 
100644 blob e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 main 
160000 commit 7c5889497938cd5699a9234a98ee93947e52b1ed sm1 
160000 commit f68bed61cba6f94cef57554f2cf46a45a4a0d337 sm2 
$ cd sm2 
$ git log --oneline --decorate 
5b8d48f (HEAD, foo1) foo1.1 
f68bed6 (origin/master, origin/HEAD, master) Initial commit. 
$ git checkout master 
Switched to branch 'master' 
$ cd .. 
$ git status 
# On branch master 
nothing to commit (working directory clean) 

的「上層項目」顯示SM2子模塊在提交f68bed6但SM2有它的頭在5b8d48f。子模塊提交f68bed6上有三個分支,可用於在子模塊目錄中籤出。

+0

感謝DAN,PERFECTO! – Alec

2

我剛碰到的另一種情況是,如果在子模塊中存在未放棄的更改,您想放棄。 git子模塊更新不會刪除該更改,也不會將git重置 - 在父目錄上。您需要轉到子模塊目錄並執行git reset --hard。所以,如果我想完全放棄我的父母和子模塊兩者不分階段的變化,我做到以下幾點:

在家長:

git reset --hard 

git submodule update 

子模塊:

git reset --hard 
相關問題