uniquejava / blog

My notes regarding the vibrating frontend :boom and the plain old java :rofl.
Creative Commons Zero v1.0 Universal
11 stars 5 forks source link

Git Submodules #227

Open uniquejava opened 6 years ago

uniquejava commented 6 years ago

Why

我有一个前端的vue项目, 我想用java/nodejs/flask等不同的技术栈给它写后端API. 我想直接把vue项目内嵌到后端项目中, 作为它们的子项目

  1. vue项目可以单独维护, 也可以作为后端项目中的子项目进行维护.
  2. 各个后端依赖于某个特定版本的vue子项目, 不会因为vue项目的升级而无法运行.
  3. 各个后端可以随时将vue子项目升级/或降级到它想要的任意版本.

这种情况下, git submodules应该是最好的选择.

References

https://www.youtube.com/watch?v=8Z4Cmhji_FQ

Dan Gitschooldude的系列视频

Mastering Git submodules

Notes

假设你的项目名为parent, 你想将一个名为child的项目做为submodule加到你的项目之下.

cd parent
git submodule add https://path/to/child.git child
git status

其它人如果想要clone你的parent项目

git clone https://path/to/parent.git

他会发现parent下多了一个叫.gitsubmodules的文件, 然后多了一个名为child的子目录, 然而进去后是空的

git submodule update --init

如果你在child中add了代码, 然后cd .. && git status

modified: child (modified content)

如果你在child中commit了代码

modified: child (new commits)

如果你在child中commit了部分代码

modified: child (new commits, untracked content)

假设以上操作全部都是在child的一个叫testing_branch的分支上操作的. 现在如果执行

# 将submodule重新指向parent所期望的位置
git submodule update #或git submodule update child 
 ## Submodule path 'child': checked out 'cfec9d'
git status
 ## HEAD detached at cfec9dd
 ## (use "git add <file>..." to include in what will be commited)
 ## newfile
cd ..
git branch
 ## *cfec9dd
 ## master
 ## testing_branch

# 回到正常的位置
cd child && git checkout testing_branch

所以git submodule update child等价于cd child && git checkout current_branch

uniquejava commented 6 years ago

git submodule status返回值中的+号表示该submodule指向的不是parent期望的那次commit.

git submodule status
## +59b5c9 child (...)

让child指向一个特定的commit

cd child
git checkout 80fb82e
git status
 ## HEAD detached at 80fb82e
cd ..
git status
 ## modified: child (new commits)
git add child
git commit -m "Changed refrence of child submobule to go back to better state"