如何在拉取请求后拥有一个干净的回购协议,包括子模块?
How to have a clean repo, including submodules, after a pull request?
我在父仓库 project_repo 中的 git 子模块 child_repo 上工作有更多的子模块。我在 child_repo 中推送更改并打开拉取请求,它是唯一的回购协议(在所有子模块中)我有可见性(和写入权限),但编译过程整个项目包括其他子模块。
在包含我的更改的拉取请求被接受后,保持整个父存储库 project_repo 干净和最新的最佳想法是什么?
目前每次我需要开始开发新功能时都只是克隆整个 project_repo,但我不认为这是 smartest/right方式。
我的猜测如下:
- 首先丢弃所有未使用
git checkout --<file>
或 git clean -xdf
提交的文件。这是因为我经常写scripts/stuff帮助我完成任务但不能去master.
git pull origin master
在 project_repo 用于更新引用
git submodule update --recursive --init
用于更新子模块的内容
感谢维克多的所有细节!
我将把父存储库称为 parent_repo 而不是 project_repo -
几个问题:
- first discard all files that were not committed with git checkout -- or git clean -xdf. This is because I often write scripts/stuff that helps me with the task but cannot go to master.
您在 parent_repo 中考虑这样做是否正确?
无论如何,我很清楚你想做什么。
假设 parent_repo/.gitmodules
中 child_repo 的设置 branch
设置为 master
,就像我们在这个例子中一样下面:
[submodule "src/child_repo"]
path = src/child_repo
branch = master # or whatever branch your PR's for child_repo get merged into
# extra (unrelated) notes on other settings here:
url = ../child.git # if parent url is github.com/company/parent, use a relative url for your child_repo, this can avoid git auth/permission/repo access issues in some ci/cd environments
fetchRecurseSubmodules = true # hopefully this setting is pointless
# update = merge # you generally dont want to merge by default
合并你到child_repo的PR后,你的想法是对的,但可以稍微优化一下。
假设您在 parent_repo/src/child_repo
中进行开发,只需:
git status # ensure you have no changes inside your `child_repo`, `git stash --all` if you do have changes.
git checkout master
git pull # now child_repo is on master with latest changes, assuming PR was merged into master
cd ../.. # now you're in `parent_repo` root
git status # clean things up if you need, stash, etc. Note, `git stash` or any other commands besides `git submodule ...` will NOT affect the state of your submodule. So, `git stash --all` should always work here
git stash --all # Only if you have changes _besides_ your src/child_repo submodule pointer
git checkout master
git pull # optionally, `git pull origin master` if you like being specific
git status # should show something like `src/child_repo`
接下来我们将 运行 git diff
但您很可能会看到红色提交哈希和绿色提交哈希。在这种情况下,您可能需要 运行 git config --global diff.submodule log
,这是我和我同事的首选默认设置。更多信息在这里:https://www.jvt.me/posts/2018/05/04/git-submodule-diff-formats/
git diff # verify commits that have been merged in are correct, ensure you aren't deleting any commits
git diff --submodule=diff # verify actual code changes are also correct (optional)
假设您只看到添加了几个绿色提交的消息,然后您可以继续更新 parent_repo
以指向 child_repo
的新版本。如果你可以直接推送到 master(怀疑)你可以:
git add .
git commit -m "your_child_repo_name: Learned to handle `--force` setting"
git push
如果您没有推送权限,则必须为此执行另一个 PR。更有可能的是,有权访问所有子模块的人应该处理更新 parent_repo 以指向新的 child_repo。你的领导 dev/maintainer 很容易,他们只是 运行:
git submodule update
git add .
git commit -m "update child_repo, child_repo2, child_repo3"
这实际上将 运行 git pull
包含在所有子模块中。
然后他们可以看到你的新提交被 运行ning git diff --submodule=log
合并了 - 当然,我假设这个首席开发人员有权直接推送到 master
我在父仓库 project_repo 中的 git 子模块 child_repo 上工作有更多的子模块。我在 child_repo 中推送更改并打开拉取请求,它是唯一的回购协议(在所有子模块中)我有可见性(和写入权限),但编译过程整个项目包括其他子模块。
在包含我的更改的拉取请求被接受后,保持整个父存储库 project_repo 干净和最新的最佳想法是什么?
目前每次我需要开始开发新功能时都只是克隆整个 project_repo,但我不认为这是 smartest/right方式。
我的猜测如下:
- 首先丢弃所有未使用
git checkout --<file>
或git clean -xdf
提交的文件。这是因为我经常写scripts/stuff帮助我完成任务但不能去master. git pull origin master
在 project_repo 用于更新引用git submodule update --recursive --init
用于更新子模块的内容
感谢维克多的所有细节!
我将把父存储库称为 parent_repo 而不是 project_repo -
几个问题:
- first discard all files that were not committed with git checkout -- or git clean -xdf. This is because I often write scripts/stuff that helps me with the task but cannot go to master.
您在 parent_repo 中考虑这样做是否正确?
无论如何,我很清楚你想做什么。
假设 parent_repo/.gitmodules
中 child_repo 的设置 branch
设置为 master
,就像我们在这个例子中一样下面:
[submodule "src/child_repo"]
path = src/child_repo
branch = master # or whatever branch your PR's for child_repo get merged into
# extra (unrelated) notes on other settings here:
url = ../child.git # if parent url is github.com/company/parent, use a relative url for your child_repo, this can avoid git auth/permission/repo access issues in some ci/cd environments
fetchRecurseSubmodules = true # hopefully this setting is pointless
# update = merge # you generally dont want to merge by default
合并你到child_repo的PR后,你的想法是对的,但可以稍微优化一下。
假设您在 parent_repo/src/child_repo
中进行开发,只需:
git status # ensure you have no changes inside your `child_repo`, `git stash --all` if you do have changes.
git checkout master
git pull # now child_repo is on master with latest changes, assuming PR was merged into master
cd ../.. # now you're in `parent_repo` root
git status # clean things up if you need, stash, etc. Note, `git stash` or any other commands besides `git submodule ...` will NOT affect the state of your submodule. So, `git stash --all` should always work here
git stash --all # Only if you have changes _besides_ your src/child_repo submodule pointer
git checkout master
git pull # optionally, `git pull origin master` if you like being specific
git status # should show something like `src/child_repo`
接下来我们将 运行 git diff
但您很可能会看到红色提交哈希和绿色提交哈希。在这种情况下,您可能需要 运行 git config --global diff.submodule log
,这是我和我同事的首选默认设置。更多信息在这里:https://www.jvt.me/posts/2018/05/04/git-submodule-diff-formats/
git diff # verify commits that have been merged in are correct, ensure you aren't deleting any commits
git diff --submodule=diff # verify actual code changes are also correct (optional)
假设您只看到添加了几个绿色提交的消息,然后您可以继续更新 parent_repo
以指向 child_repo
的新版本。如果你可以直接推送到 master(怀疑)你可以:
git add .
git commit -m "your_child_repo_name: Learned to handle `--force` setting"
git push
如果您没有推送权限,则必须为此执行另一个 PR。更有可能的是,有权访问所有子模块的人应该处理更新 parent_repo 以指向新的 child_repo。你的领导 dev/maintainer 很容易,他们只是 运行:
git submodule update
git add .
git commit -m "update child_repo, child_repo2, child_repo3"
这实际上将 运行 git pull
包含在所有子模块中。
然后他们可以看到你的新提交被 运行ning git diff --submodule=log
合并了 - 当然,我假设这个首席开发人员有权直接推送到 master