git-nested 1.2.1__tar.gz → 1.2.2__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {git_nested-1.2.1 → git_nested-1.2.2}/.github/workflows/docs.yml +1 -1
- {git_nested-1.2.1 → git_nested-1.2.2}/.github/workflows/publish.yml +1 -1
- {git_nested-1.2.1 → git_nested-1.2.2}/.github/workflows/test-binary.yml +1 -1
- {git_nested-1.2.1 → git_nested-1.2.2}/.github/workflows/test.yml +33 -2
- {git_nested-1.2.1/src/git_nested.egg-info → git_nested-1.2.2}/PKG-INFO +11 -2
- {git_nested-1.2.1 → git_nested-1.2.2}/README.md +9 -0
- {git_nested-1.2.1 → git_nested-1.2.2}/doc/architecture/diagrams.md +227 -2
- {git_nested-1.2.1 → git_nested-1.2.2}/doc/architecture/index.md +2 -0
- {git_nested-1.2.1 → git_nested-1.2.2}/doc/cli/branch.md +11 -0
- {git_nested-1.2.1 → git_nested-1.2.2}/doc/cli/clone.md +8 -0
- {git_nested-1.2.1 → git_nested-1.2.2}/doc/cli/commit.md +4 -0
- {git_nested-1.2.1 → git_nested-1.2.2}/doc/cli/config.md +6 -2
- {git_nested-1.2.1 → git_nested-1.2.2}/doc/cli/index.md +5 -1
- {git_nested-1.2.1 → git_nested-1.2.2}/doc/cli/init.md +1 -0
- git_nested-1.2.2/doc/cli/patches.md +113 -0
- {git_nested-1.2.1 → git_nested-1.2.2}/doc/cli/pull.md +33 -4
- {git_nested-1.2.1 → git_nested-1.2.2}/doc/cli/push.md +12 -0
- git_nested-1.2.2/doc/cli/submodules.md +242 -0
- git_nested-1.2.2/doc/cli/verify.md +86 -0
- {git_nested-1.2.1 → git_nested-1.2.2}/doc/concepts/comparison.md +2 -1
- {git_nested-1.2.1 → git_nested-1.2.2}/doc/configuration/gitnested-file.md +57 -0
- {git_nested-1.2.1 → git_nested-1.2.2}/doc/guides/conflicts.md +5 -0
- git_nested-1.2.2/doc/guides/patches.md +261 -0
- {git_nested-1.2.1 → git_nested-1.2.2}/doc/guides/pin.md +9 -0
- git_nested-1.2.2/doc/guides/submodules.md +91 -0
- {git_nested-1.2.1 → git_nested-1.2.2}/doc/index.md +8 -0
- {git_nested-1.2.1 → git_nested-1.2.2}/man/man1/git-nested.1 +9 -0
- {git_nested-1.2.1 → git_nested-1.2.2}/pyproject.toml +34 -3
- {git_nested-1.2.1 → git_nested-1.2.2}/src/git_nested/checks.py +21 -8
- {git_nested-1.2.1 → git_nested-1.2.2}/src/git_nested/cli/location.py +17 -1
- {git_nested-1.2.1 → git_nested-1.2.2}/src/git_nested/cli/parser.py +69 -2
- {git_nested-1.2.1 → git_nested-1.2.2}/src/git_nested/cli/setup.py +5 -3
- {git_nested-1.2.1 → git_nested-1.2.2}/src/git_nested/cli/spec.py +190 -4
- {git_nested-1.2.1 → git_nested-1.2.2}/src/git_nested/commands/__init__.py +6 -0
- {git_nested-1.2.1 → git_nested-1.2.2}/src/git_nested/commands/branch.py +34 -2
- {git_nested-1.2.1 → git_nested-1.2.2}/src/git_nested/commands/clean.py +1 -1
- {git_nested-1.2.1 → git_nested-1.2.2}/src/git_nested/commands/clone.py +53 -15
- {git_nested-1.2.1 → git_nested-1.2.2}/src/git_nested/commands/commit.py +8 -4
- {git_nested-1.2.1 → git_nested-1.2.2}/src/git_nested/commands/config.py +1 -0
- {git_nested-1.2.1 → git_nested-1.2.2}/src/git_nested/commands/diff.py +3 -1
- {git_nested-1.2.1 → git_nested-1.2.2}/src/git_nested/commands/init.py +7 -4
- git_nested-1.2.2/src/git_nested/commands/patchset.py +222 -0
- {git_nested-1.2.1 → git_nested-1.2.2}/src/git_nested/commands/pull.py +132 -9
- {git_nested-1.2.1 → git_nested-1.2.2}/src/git_nested/commands/push.py +55 -5
- {git_nested-1.2.1 → git_nested-1.2.2}/src/git_nested/commands/status.py +4 -2
- git_nested-1.2.2/src/git_nested/commands/submodules.py +885 -0
- git_nested-1.2.2/src/git_nested/commands/verify.py +153 -0
- git_nested-1.2.2/src/git_nested/content.py +304 -0
- {git_nested-1.2.1 → git_nested-1.2.2}/src/git_nested/discovery.py +1 -1
- {git_nested-1.2.1 → git_nested-1.2.2}/src/git_nested/filters.py +48 -0
- {git_nested-1.2.1 → git_nested-1.2.2}/src/git_nested/git.py +19 -2
- {git_nested-1.2.1 → git_nested-1.2.2}/src/git_nested/gitfile.py +6 -2
- {git_nested-1.2.1 → git_nested-1.2.2}/src/git_nested/history.py +80 -7
- {git_nested-1.2.1 → git_nested-1.2.2}/src/git_nested/messages.py +9 -7
- {git_nested-1.2.1 → git_nested-1.2.2}/src/git_nested/models.py +60 -0
- git_nested-1.2.2/src/git_nested/patchbuild.py +128 -0
- git_nested-1.2.2/src/git_nested/patches.py +300 -0
- git_nested-1.2.2/src/git_nested/patchpick.py +55 -0
- {git_nested-1.2.1 → git_nested-1.2.2}/src/git_nested/refs.py +11 -6
- {git_nested-1.2.1 → git_nested-1.2.2}/src/git_nested/submodules.py +29 -7
- {git_nested-1.2.1 → git_nested-1.2.2}/src/git_nested/worktree.py +15 -0
- {git_nested-1.2.1 → git_nested-1.2.2/src/git_nested.egg-info}/PKG-INFO +11 -2
- {git_nested-1.2.1 → git_nested-1.2.2}/src/git_nested.egg-info/SOURCES.txt +17 -0
- {git_nested-1.2.1 → git_nested-1.2.2}/src/git_nested.egg-info/scm_file_list.json +17 -0
- git_nested-1.2.2/src/git_nested.egg-info/scm_version.json +8 -0
- {git_nested-1.2.1 → git_nested-1.2.2}/tests/conftest.py +78 -36
- {git_nested-1.2.1 → git_nested-1.2.2}/tests/e2e/scenarios/test_extraction.py +3 -3
- git_nested-1.2.2/tests/e2e/test_attributes.py +68 -0
- {git_nested-1.2.1 → git_nested-1.2.2}/tests/e2e/test_diff.py +2 -2
- {git_nested-1.2.1 → git_nested-1.2.2}/tests/e2e/test_error.py +2 -2
- git_nested-1.2.2/tests/e2e/test_ignore.py +149 -0
- git_nested-1.2.2/tests/e2e/test_issue_184.py +364 -0
- git_nested-1.2.2/tests/e2e/test_patches.py +1113 -0
- git_nested-1.2.2/tests/e2e/test_pin.py +142 -0
- {git_nested-1.2.1 → git_nested-1.2.2}/tests/e2e/test_pull.py +48 -7
- {git_nested-1.2.1 → git_nested-1.2.2}/tests/e2e/test_push.py +2 -2
- {git_nested-1.2.1 → git_nested-1.2.2}/tests/e2e/test_rebase.py +1 -1
- {git_nested-1.2.1 → git_nested-1.2.2}/tests/e2e/test_signing.py +4 -1
- git_nested-1.2.2/tests/e2e/test_submodules.py +264 -0
- git_nested-1.2.2/tests/e2e/test_submodules_command.py +1483 -0
- git_nested-1.2.2/tests/e2e/test_submodules_contribute.py +196 -0
- git_nested-1.2.2/tests/e2e/test_verify.py +276 -0
- {git_nested-1.2.1 → git_nested-1.2.2}/tests/e2e/test_version.py +7 -1
- {git_nested-1.2.1 → git_nested-1.2.2}/tests/unit/test_command.py +32 -0
- {git_nested-1.2.1 → git_nested-1.2.2}/tests/unit/test_completion_engine.py +2 -2
- {git_nested-1.2.1 → git_nested-1.2.2}/tests/unit/test_helpers.py +52 -4
- {git_nested-1.2.1 → git_nested-1.2.2}/tests/unit/test_repo_business.py +4 -12
- {git_nested-1.2.1 → git_nested-1.2.2}/uv.lock +261 -259
- git_nested-1.2.1/doc/guides/submodules.md +0 -49
- git_nested-1.2.1/src/git_nested/content.py +0 -162
- git_nested-1.2.1/src/git_nested.egg-info/scm_version.json +0 -8
- git_nested-1.2.1/tests/e2e/test_pin.py +0 -51
- git_nested-1.2.1/tests/e2e/test_submodules.py +0 -123
- {git_nested-1.2.1 → git_nested-1.2.2}/.codecov.yml +0 -0
- {git_nested-1.2.1 → git_nested-1.2.2}/.fish.rc +0 -0
- {git_nested-1.2.1 → git_nested-1.2.2}/.gitattributes +0 -0
- {git_nested-1.2.1 → git_nested-1.2.2}/.github/CODEOWNERS +0 -0
- {git_nested-1.2.1 → git_nested-1.2.2}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {git_nested-1.2.1 → git_nested-1.2.2}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {git_nested-1.2.1 → git_nested-1.2.2}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
- {git_nested-1.2.1 → git_nested-1.2.2}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {git_nested-1.2.1 → git_nested-1.2.2}/.github/dependabot.yml +0 -0
- {git_nested-1.2.1 → git_nested-1.2.2}/.github/release.yml +0 -0
- {git_nested-1.2.1 → git_nested-1.2.2}/.github/workflows/build-binary.yml +0 -0
- {git_nested-1.2.1 → git_nested-1.2.2}/.github/workflows/prune-artifacts.yml +0 -0
- {git_nested-1.2.1 → git_nested-1.2.2}/.github/workflows/release-binary.yml +0 -0
- {git_nested-1.2.1 → git_nested-1.2.2}/.gitignore +0 -0
- {git_nested-1.2.1 → git_nested-1.2.2}/.pre-commit-config.yaml +0 -0
- {git_nested-1.2.1 → git_nested-1.2.2}/.rc +0 -0
- {git_nested-1.2.1 → git_nested-1.2.2}/CONTRIBUTING.md +0 -0
- {git_nested-1.2.1 → git_nested-1.2.2}/LICENSE +0 -0
- {git_nested-1.2.1 → git_nested-1.2.2}/SECURITY.md +0 -0
- {git_nested-1.2.1 → git_nested-1.2.2}/bin/git-nested +0 -0
- {git_nested-1.2.1 → git_nested-1.2.2}/doc/README.md +0 -0
- {git_nested-1.2.1 → git_nested-1.2.2}/doc/_static/custom.css +0 -0
- {git_nested-1.2.1 → git_nested-1.2.2}/doc/_static/custom.js +0 -0
- {git_nested-1.2.1 → git_nested-1.2.2}/doc/_static/favicon.svg +0 -0
- {git_nested-1.2.1 → git_nested-1.2.2}/doc/_static/logo.svg +0 -0
- {git_nested-1.2.1 → git_nested-1.2.2}/doc/_templates/layout.html +0 -0
- {git_nested-1.2.1 → git_nested-1.2.2}/doc/cli/clean.md +0 -0
- {git_nested-1.2.1 → git_nested-1.2.2}/doc/cli/completion.md +0 -0
- {git_nested-1.2.1 → git_nested-1.2.2}/doc/cli/diff.md +0 -0
- {git_nested-1.2.1 → git_nested-1.2.2}/doc/cli/environment-variables.md +0 -0
- {git_nested-1.2.1 → git_nested-1.2.2}/doc/cli/fetch.md +0 -0
- {git_nested-1.2.1 → git_nested-1.2.2}/doc/cli/repair.md +0 -0
- {git_nested-1.2.1 → git_nested-1.2.2}/doc/cli/run.md +0 -0
- {git_nested-1.2.1 → git_nested-1.2.2}/doc/cli/status.md +0 -0
- {git_nested-1.2.1 → git_nested-1.2.2}/doc/cli/version.md +0 -0
- {git_nested-1.2.1 → git_nested-1.2.2}/doc/concepts/glossary.md +0 -0
- {git_nested-1.2.1 → git_nested-1.2.2}/doc/concepts/how-it-works.md +0 -0
- {git_nested-1.2.1 → git_nested-1.2.2}/doc/conf.py +0 -0
- {git_nested-1.2.1 → git_nested-1.2.2}/doc/configuration/examples.md +0 -0
- {git_nested-1.2.1 → git_nested-1.2.2}/doc/configuration/git-config.md +0 -0
- {git_nested-1.2.1 → git_nested-1.2.2}/doc/contributing/development.md +0 -0
- {git_nested-1.2.1 → git_nested-1.2.2}/doc/contributing/documentation.md +0 -0
- {git_nested-1.2.1 → git_nested-1.2.2}/doc/guides/adopt.md +0 -0
- {git_nested-1.2.1 → git_nested-1.2.2}/doc/guides/hooks-and-signing.md +0 -0
- {git_nested-1.2.1 → git_nested-1.2.2}/doc/guides/many.md +0 -0
- {git_nested-1.2.1 → git_nested-1.2.2}/doc/guides/nested-in-nested.md +0 -0
- {git_nested-1.2.1 → git_nested-1.2.2}/doc/guides/partial.md +0 -0
- {git_nested-1.2.1 → git_nested-1.2.2}/doc/guides/squash-merges.md +0 -0
- {git_nested-1.2.1 → git_nested-1.2.2}/doc/introduction/index.md +0 -0
- {git_nested-1.2.1 → git_nested-1.2.2}/doc/introduction/install.md +0 -0
- {git_nested-1.2.1 → git_nested-1.2.2}/doc/quickstart/05-minutes.md +0 -0
- {git_nested-1.2.1 → git_nested-1.2.2}/doc/quickstart/everyday.md +0 -0
- {git_nested-1.2.1 → git_nested-1.2.2}/scripts/create-python-exe.sh +0 -0
- {git_nested-1.2.1 → git_nested-1.2.2}/setup.cfg +0 -0
- {git_nested-1.2.1 → git_nested-1.2.2}/sonar-project.properties +0 -0
- {git_nested-1.2.1 → git_nested-1.2.2}/src/git_nested/__init__.py +0 -0
- {git_nested-1.2.1 → git_nested-1.2.2}/src/git_nested/__main__.py +0 -0
- {git_nested-1.2.1 → git_nested-1.2.2}/src/git_nested/_compat.py +0 -0
- {git_nested-1.2.1 → git_nested-1.2.2}/src/git_nested/_version.py +0 -0
- {git_nested-1.2.1 → git_nested-1.2.2}/src/git_nested/cli/__init__.py +0 -0
- {git_nested-1.2.1 → git_nested-1.2.2}/src/git_nested/cli/app.py +0 -0
- {git_nested-1.2.1 → git_nested-1.2.2}/src/git_nested/cli/main.py +0 -0
- {git_nested-1.2.1 → git_nested-1.2.2}/src/git_nested/commands/completion.py +0 -0
- {git_nested-1.2.1 → git_nested-1.2.2}/src/git_nested/commands/fetch.py +0 -0
- {git_nested-1.2.1 → git_nested-1.2.2}/src/git_nested/commands/repair.py +0 -0
- {git_nested-1.2.1 → git_nested-1.2.2}/src/git_nested/commands/run.py +0 -0
- {git_nested-1.2.1 → git_nested-1.2.2}/src/git_nested/commands/version.py +0 -0
- {git_nested-1.2.1 → git_nested-1.2.2}/src/git_nested/completion/__init__.py +0 -0
- {git_nested-1.2.1 → git_nested-1.2.2}/src/git_nested/completion/scripts.py +0 -0
- {git_nested-1.2.1 → git_nested-1.2.2}/src/git_nested/configio.py +0 -0
- {git_nested-1.2.1 → git_nested-1.2.2}/src/git_nested/constants.py +0 -0
- {git_nested-1.2.1 → git_nested-1.2.2}/src/git_nested/errors.py +0 -0
- {git_nested-1.2.1 → git_nested-1.2.2}/src/git_nested/output.py +0 -0
- {git_nested-1.2.1 → git_nested-1.2.2}/src/git_nested/py.typed +0 -0
- {git_nested-1.2.1 → git_nested-1.2.2}/src/git_nested.egg-info/dependency_links.txt +0 -0
- {git_nested-1.2.1 → git_nested-1.2.2}/src/git_nested.egg-info/entry_points.txt +0 -0
- {git_nested-1.2.1 → git_nested-1.2.2}/src/git_nested.egg-info/requires.txt +0 -0
- {git_nested-1.2.1 → git_nested-1.2.2}/src/git_nested.egg-info/top_level.txt +0 -0
- {git_nested-1.2.1 → git_nested-1.2.2}/tests/e2e/scenarios/test_filemode.py +0 -0
- {git_nested-1.2.1 → git_nested-1.2.2}/tests/e2e/scenarios/test_filter.py +0 -0
- {git_nested-1.2.1 → git_nested-1.2.2}/tests/e2e/test_branch.py +0 -0
- {git_nested-1.2.1 → git_nested-1.2.2}/tests/e2e/test_clean.py +0 -0
- {git_nested-1.2.1 → git_nested-1.2.2}/tests/e2e/test_clone.py +0 -0
- {git_nested-1.2.1 → git_nested-1.2.2}/tests/e2e/test_commit.py +0 -0
- {git_nested-1.2.1 → git_nested-1.2.2}/tests/e2e/test_completion.py +0 -0
- {git_nested-1.2.1 → git_nested-1.2.2}/tests/e2e/test_config.py +0 -0
- {git_nested-1.2.1 → git_nested-1.2.2}/tests/e2e/test_detached.py +0 -0
- {git_nested-1.2.1 → git_nested-1.2.2}/tests/e2e/test_encode.py +0 -0
- {git_nested-1.2.1 → git_nested-1.2.2}/tests/e2e/test_exclude.py +0 -0
- {git_nested-1.2.1 → git_nested-1.2.2}/tests/e2e/test_fetch.py +0 -0
- {git_nested-1.2.1 → git_nested-1.2.2}/tests/e2e/test_gitignore.py +0 -0
- {git_nested-1.2.1 → git_nested-1.2.2}/tests/e2e/test_init.py +0 -0
- {git_nested-1.2.1 → git_nested-1.2.2}/tests/e2e/test_nested_in_nested.py +0 -0
- {git_nested-1.2.1 → git_nested-1.2.2}/tests/e2e/test_non_ascii.py +0 -0
- {git_nested-1.2.1 → git_nested-1.2.2}/tests/e2e/test_reclone.py +0 -0
- {git_nested-1.2.1 → git_nested-1.2.2}/tests/e2e/test_repair.py +0 -0
- {git_nested-1.2.1 → git_nested-1.2.2}/tests/e2e/test_run.py +0 -0
- {git_nested-1.2.1 → git_nested-1.2.2}/tests/e2e/test_status.py +0 -0
- {git_nested-1.2.1 → git_nested-1.2.2}/tests/e2e/test_subdirectory.py +0 -0
- {git_nested-1.2.1 → git_nested-1.2.2}/tests/e2e/test_submodule.py +0 -0
- {git_nested-1.2.1 → git_nested-1.2.2}/tests/e2e/test_toml.py +0 -0
- {git_nested-1.2.1 → git_nested-1.2.2}/tests/e2e/test_upstream_path.py +0 -0
- {git_nested-1.2.1 → git_nested-1.2.2}/tests/unit/conftest.py +0 -0
- {git_nested-1.2.1 → git_nested-1.2.2}/tests/unit/fakes.py +0 -0
- {git_nested-1.2.1 → git_nested-1.2.2}/tests/unit/test_adopt.py +0 -0
- {git_nested-1.2.1 → git_nested-1.2.2}/tests/unit/test_configio.py +0 -0
- {git_nested-1.2.1 → git_nested-1.2.2}/tests/unit/test_docs.py +0 -0
- {git_nested-1.2.1 → git_nested-1.2.2}/tests/unit/test_logging.py +0 -0
|
@@ -5,6 +5,15 @@ on:
|
|
|
5
5
|
branches: [main]
|
|
6
6
|
pull_request:
|
|
7
7
|
branches: ['**']
|
|
8
|
+
# daily on main (scheduled runs always use the default branch), so a
|
|
9
|
+
# breaking change in a dependency, runner image or upstream download shows
|
|
10
|
+
# up even on a day without any commit
|
|
11
|
+
schedule:
|
|
12
|
+
- cron: '0 18 * * *'
|
|
13
|
+
timezone: Europe/Berlin
|
|
14
|
+
# by hand for any branch: 'Run workflow' in the Actions tab, or
|
|
15
|
+
# `gh workflow run test.yml --ref <branch>`
|
|
16
|
+
workflow_dispatch:
|
|
8
17
|
|
|
9
18
|
# One run per branch/PR at a time. On a PR a newer push cancels the run in
|
|
10
19
|
# progress: only the newest commit's results matter there, and waiting for a
|
|
@@ -68,7 +77,8 @@ jobs:
|
|
|
68
77
|
fail-fast: false
|
|
69
78
|
matrix:
|
|
70
79
|
os: [ubuntu-26.04, macos-latest, windows-latest]
|
|
71
|
-
|
|
80
|
+
# A PR runs only the oldest and newest Python. main runs all of them.
|
|
81
|
+
python-version: ${{ fromJSON(github.event_name == 'pull_request' && '["3.10", "3.14"]' || '["3.10", "3.11", "3.12", "3.13", "3.14"]') }}
|
|
72
82
|
|
|
73
83
|
steps:
|
|
74
84
|
- name: Checkout code
|
|
@@ -78,8 +88,29 @@ jobs:
|
|
|
78
88
|
# authorship) needs real history, not the default shallow, tagless
|
|
79
89
|
# checkout.
|
|
80
90
|
fetch-depth: 0
|
|
91
|
+
# The tests start many git processes and write many small files.
|
|
92
|
+
# On Windows, Defender scans each one, which makes the tests slow.
|
|
93
|
+
- name: Turn off Defender scanning
|
|
94
|
+
if: runner.os == 'Windows'
|
|
95
|
+
shell: pwsh
|
|
96
|
+
run: Set-MpPreference -DisableRealtimeMonitoring $true
|
|
97
|
+
# A Dev Drive is a fast ReFS drive. TEMP points there, so the test
|
|
98
|
+
# repos in tmp_path live on it.
|
|
99
|
+
- name: Set up Dev Drive
|
|
100
|
+
if: runner.os == 'Windows'
|
|
101
|
+
uses: samypr100/setup-dev-drive@v4.1.0
|
|
102
|
+
with:
|
|
103
|
+
drive-size: 8GB
|
|
104
|
+
drive-path: ${{ runner.temp }}/dev_drive.vhdx
|
|
105
|
+
trusted-dev-drive: true
|
|
106
|
+
env-mapping: |
|
|
107
|
+
TEMP,{{ DEV_DRIVE }}/tmp
|
|
108
|
+
TMP,{{ DEV_DRIVE }}/tmp
|
|
109
|
+
- name: Create temp dir on Dev Drive
|
|
110
|
+
if: runner.os == 'Windows'
|
|
111
|
+
run: mkdir -p "$TEMP" && echo "TEMP=$TEMP"
|
|
81
112
|
- name: Install uv
|
|
82
|
-
uses: astral-sh/setup-uv@v10.3.
|
|
113
|
+
uses: astral-sh/setup-uv@v10.3.3
|
|
83
114
|
with:
|
|
84
115
|
python-version: ${{ matrix.python-version }}
|
|
85
116
|
enable-cache: true
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: git-nested
|
|
3
|
-
Version: 1.2.
|
|
3
|
+
Version: 1.2.2
|
|
4
4
|
Summary: Git Submodule Alternative
|
|
5
5
|
Author-email: Thorsten Klein <thorsten.klein.git@gmail.com>
|
|
6
6
|
License: MIT
|
|
@@ -8,7 +8,7 @@ Project-URL: Homepage, https://github.com/thorsten-klein/git-nested
|
|
|
8
8
|
Project-URL: Documentation, https://thorsten-klein.github.io/git-nested/
|
|
9
9
|
Project-URL: Repository, https://github.com/thorsten-klein/git-nested
|
|
10
10
|
Project-URL: Issues, https://github.com/thorsten-klein/git-nested/issues
|
|
11
|
-
Keywords: git,
|
|
11
|
+
Keywords: cli,dependency-management,developer-tools,git,git-extension,git-submodule,git-submodules,git-subrepo,git-subtree,git-tools,monorepo,multi-repo,nested-repositories,python,repository-management,submodules,subrepo,subtree,vendoring,version-control
|
|
12
12
|
Classifier: Development Status :: 4 - Beta
|
|
13
13
|
Classifier: Intended Audience :: Developers
|
|
14
14
|
Classifier: Topic :: Software Development :: Version Control :: Git
|
|
@@ -56,6 +56,15 @@ git nested status # see where everything st
|
|
|
56
56
|
A small `.gitnested` file in the folder remembers the URL, the branch and
|
|
57
57
|
the upstream commit. So the commands stay short.
|
|
58
58
|
|
|
59
|
+
Your repository has submodules already? Turn them all into nested
|
|
60
|
+
repositories, and keep following upstream:
|
|
61
|
+
|
|
62
|
+
```bash
|
|
63
|
+
git nested submodules init --recursive
|
|
64
|
+
git fetch origin
|
|
65
|
+
git nested submodules update origin/main
|
|
66
|
+
```
|
|
67
|
+
|
|
59
68
|
## Why git-nested?
|
|
60
69
|
|
|
61
70
|
- **Self-contained.** Your repository has all files. A plain `git clone`
|
|
@@ -30,6 +30,15 @@ git nested status # see where everything st
|
|
|
30
30
|
A small `.gitnested` file in the folder remembers the URL, the branch and
|
|
31
31
|
the upstream commit. So the commands stay short.
|
|
32
32
|
|
|
33
|
+
Your repository has submodules already? Turn them all into nested
|
|
34
|
+
repositories, and keep following upstream:
|
|
35
|
+
|
|
36
|
+
```bash
|
|
37
|
+
git nested submodules init --recursive
|
|
38
|
+
git fetch origin
|
|
39
|
+
git nested submodules update origin/main
|
|
40
|
+
```
|
|
41
|
+
|
|
33
42
|
## Why git-nested?
|
|
34
43
|
|
|
35
44
|
- **Self-contained.** Your repository has all files. A plain `git clone`
|
|
@@ -69,6 +69,12 @@ sequenceDiagram
|
|
|
69
69
|
git-nested->>Git: ls-files -- <subdir>
|
|
70
70
|
git-nested->>Git: read-tree --prefix=<subdir> -u <nested_commit_ref>
|
|
71
71
|
Note over git-nested: Write .gitnested
|
|
72
|
+
opt patches in use
|
|
73
|
+
git-nested->>Git: checkout HEAD -- <inner repos added here>
|
|
74
|
+
git-nested->>Git: rm -r -f / checkout HEAD -- <patches-ignore paths>
|
|
75
|
+
git-nested->>Git: format-patch --zero-commit --no-signature -o <folder> <upstream>..<nested_commit_ref> -- <without local paths>
|
|
76
|
+
git-nested->>Git: add -A -f -- <folder>
|
|
77
|
+
end
|
|
72
78
|
git-nested->>Git: rev-parse <nested_commit_ref>
|
|
73
79
|
git-nested->>Git: add -f -- <subdir>/.gitnested
|
|
74
80
|
git-nested->>Git: diff --cached --quiet
|
|
@@ -207,6 +213,13 @@ sequenceDiagram
|
|
|
207
213
|
git-nested->>Git: diff-index --quiet --cached --ignore-submodules HEAD
|
|
208
214
|
git-nested->>Git: rev-parse HEAD
|
|
209
215
|
|
|
216
|
+
opt patches in use (HEAD has a patch)
|
|
217
|
+
Note over git-nested: Stop if subdir has changes the patches do not hold
|
|
218
|
+
git-nested->>Git: worktree add --detach .git/tmp/patches/<subref> <recorded commit>
|
|
219
|
+
git-nested->>Git: am -3 --keep-cr <patch>... (in the worktree)
|
|
220
|
+
git-nested->>Git: diff --quiet HEAD <local tree> -- <without the patches folder, inner repos, patches-ignore>
|
|
221
|
+
end
|
|
222
|
+
|
|
210
223
|
rect rgb(230, 245, 255)
|
|
211
224
|
Note over git-nested,Git: do_fetch
|
|
212
225
|
git-nested->>Git: fetch --no-tags --quiet <remote> <branch>
|
|
@@ -229,6 +242,12 @@ sequenceDiagram
|
|
|
229
242
|
git-nested->>Git: branch -D nested/<subref>
|
|
230
243
|
end
|
|
231
244
|
|
|
245
|
+
opt patches in use: instead of create_nested_branch and the merge or rebase
|
|
246
|
+
git-nested->>Git: worktree add --no-checkout -b nested/<subref> <worktree> refs/nested/<subref>/fetch
|
|
247
|
+
git-nested->>Git: am -3 --keep-cr <all patches> (in the worktree)
|
|
248
|
+
Note over git-nested: On a conflict: stop and name the patch. git am --continue goes on with the rest
|
|
249
|
+
end
|
|
250
|
+
|
|
232
251
|
rect rgb(230, 245, 255)
|
|
233
252
|
Note over git-nested,Git: create_nested_branch
|
|
234
253
|
git-nested->>Git: rev-list refs/heads/nested/<subref> -1
|
|
@@ -265,6 +284,16 @@ sequenceDiagram
|
|
|
265
284
|
git-nested->>Git: update-ref refs/nested/<subref>/branch nested/<subref>
|
|
266
285
|
end
|
|
267
286
|
|
|
287
|
+
opt --ignore
|
|
288
|
+
Note over git-nested: Upstream, with the ignored paths from the recorded commit
|
|
289
|
+
git-nested->>Git: read-tree <upstream> (temporary index)
|
|
290
|
+
git-nested->>Git: rm --cached -r -q -f --ignore-unmatch -- <ignored>
|
|
291
|
+
git-nested->>Git: ls-tree -r -z --full-tree <recorded commit> -- <ignored>
|
|
292
|
+
git-nested->>Git: update-index -z --index-info
|
|
293
|
+
git-nested->>Git: commit-tree -p <upstream> <tree>
|
|
294
|
+
Note over git-nested: The merge and rebase below use this commit
|
|
295
|
+
end
|
|
296
|
+
|
|
268
297
|
alt method = merge
|
|
269
298
|
git-nested->>Git: merge --ff --no-edit refs/nested/<subref>/fetch
|
|
270
299
|
Note over git-nested: (in worktree)
|
|
@@ -283,6 +312,12 @@ sequenceDiagram
|
|
|
283
312
|
git-nested->>Git: rm -r -- <subdir>
|
|
284
313
|
git-nested->>Git: read-tree --prefix=<subdir> -u <nested_commit_ref>
|
|
285
314
|
Note over git-nested: Write .gitnested
|
|
315
|
+
opt patches in use
|
|
316
|
+
git-nested->>Git: checkout HEAD -- <inner repos added here>
|
|
317
|
+
git-nested->>Git: rm -r -f / checkout HEAD -- <patches-ignore paths>
|
|
318
|
+
git-nested->>Git: format-patch --zero-commit --no-signature -o <folder> <upstream>..<nested_commit_ref> -- <without local paths>
|
|
319
|
+
git-nested->>Git: add -A -f -- <folder>
|
|
320
|
+
end
|
|
286
321
|
git-nested->>Git: add -f -- <subdir>/.gitnested
|
|
287
322
|
git-nested->>Git: diff --cached --quiet
|
|
288
323
|
git-nested->>Git: commit --no-verify [--signoff] [-S] -m <message>
|
|
@@ -314,8 +349,11 @@ sequenceDiagram
|
|
|
314
349
|
end
|
|
315
350
|
end
|
|
316
351
|
|
|
317
|
-
opt Submodules of upstream that
|
|
318
|
-
Note over git-nested:
|
|
352
|
+
opt Submodules of upstream that are nested
|
|
353
|
+
Note over git-nested: Put them back from HEAD, with your changes.<br/>Then pull each to the commit upstream pins now
|
|
354
|
+
end
|
|
355
|
+
opt --recurse-submodules
|
|
356
|
+
Note over git-nested: Nest each new one at the commit upstream pins (as in clone)
|
|
319
357
|
end
|
|
320
358
|
|
|
321
359
|
Note over git-nested: The commit message lists the new upstream commits
|
|
@@ -379,6 +417,8 @@ sequenceDiagram
|
|
|
379
417
|
Note over git-nested: (Same branch creation as in pull — see pull diagram)
|
|
380
418
|
git-nested->>Git: ls-tree -r -z --name-only HEAD -- <subdir>
|
|
381
419
|
Note over git-nested: Also drop .gitnested.levelN files and inner nested repos upstream does not have
|
|
420
|
+
Note over git-nested: With --ignore: the ignored paths come from upstream
|
|
421
|
+
Note over git-nested: The patches folder is dropped. patches-ignore paths come from upstream
|
|
382
422
|
git-nested->>Git: branch nested/<subref> <tip>
|
|
383
423
|
git-nested->>Git: worktree add --no-checkout <worktree_path> nested/<subref>
|
|
384
424
|
git-nested->>Git: reset -q --hard (in the worktree)
|
|
@@ -418,6 +458,8 @@ sequenceDiagram
|
|
|
418
458
|
opt --commit flag
|
|
419
459
|
Note over git-nested: Update .gitnested
|
|
420
460
|
git-nested->>Git: add -f -- <subdir>/.gitnested
|
|
461
|
+
Note over git-nested: Empty the patches folder: upstream has the changes now
|
|
462
|
+
git-nested->>Git: add -A -f -- <folder>
|
|
421
463
|
git-nested->>Git: commit --no-verify [--signoff] [-S] -m <message>
|
|
422
464
|
Note over git-nested: If it fails: reset -q --hard HEAD
|
|
423
465
|
end
|
|
@@ -652,7 +694,14 @@ sequenceDiagram
|
|
|
652
694
|
git-nested->>Git: ls-files -- <subdir>
|
|
653
695
|
git-nested->>Git: rm -r -- <subdir>
|
|
654
696
|
git-nested->>Git: read-tree --prefix=<subdir> -u <nested_commit_ref>
|
|
697
|
+
Note over git-nested: Inner nested repos: checkout HEAD -- <path>, not the gitlink
|
|
655
698
|
Note over git-nested: Write .gitnested
|
|
699
|
+
opt patches in use
|
|
700
|
+
git-nested->>Git: checkout HEAD -- <inner repos added here>
|
|
701
|
+
git-nested->>Git: rm -r -f / checkout HEAD -- <patches-ignore paths>
|
|
702
|
+
git-nested->>Git: format-patch --zero-commit --no-signature -o <folder> <upstream>..<nested_commit_ref> -- <without local paths>
|
|
703
|
+
git-nested->>Git: add -A -f -- <folder>
|
|
704
|
+
end
|
|
656
705
|
git-nested->>Git: rev-parse <nested_commit_ref>
|
|
657
706
|
git-nested->>Git: add -f -- <subdir>/.gitnested
|
|
658
707
|
git-nested->>Git: diff --cached --quiet
|
|
@@ -663,6 +712,10 @@ sequenceDiagram
|
|
|
663
712
|
Note over git-nested: Remove empty parent dirs up to .git/tmp
|
|
664
713
|
git-nested->>Git: update-ref refs/nested/<subref>/commit <nested_commit_ref>
|
|
665
714
|
end
|
|
715
|
+
|
|
716
|
+
opt Inner nested repos
|
|
717
|
+
Note over git-nested: Pull each to the commit upstream pins now (as in pull)
|
|
718
|
+
end
|
|
666
719
|
```
|
|
667
720
|
|
|
668
721
|
---
|
|
@@ -728,6 +781,53 @@ sequenceDiagram
|
|
|
728
781
|
|
|
729
782
|
---
|
|
730
783
|
|
|
784
|
+
## submodules
|
|
785
|
+
|
|
786
|
+
`init` runs `init --from-submodule` for each submodule. `update` looks
|
|
787
|
+
like this:
|
|
788
|
+
|
|
789
|
+
```mermaid
|
|
790
|
+
sequenceDiagram
|
|
791
|
+
participant User
|
|
792
|
+
participant git-nested
|
|
793
|
+
participant Git
|
|
794
|
+
|
|
795
|
+
User->>git-nested: git nested submodules update <commit>
|
|
796
|
+
git-nested->>Git: merge-base --is-ancestor <commit> HEAD
|
|
797
|
+
Note over git-nested: Merged already: only update the nested repos that lag behind
|
|
798
|
+
opt --dry-run
|
|
799
|
+
Note over git-nested: Print the plan, also deeper down, then stop
|
|
800
|
+
end
|
|
801
|
+
git-nested->>Git: merge --no-commit --no-ff <commit>
|
|
802
|
+
Note over git-nested: Write .git/nested-submodules-update.json for --continue and --abort
|
|
803
|
+
git-nested->>Git: update-index --force-remove <gitlink>
|
|
804
|
+
Note over git-nested: Drop each gitlink and its part of .gitmodules
|
|
805
|
+
Note over git-nested: Merge .gitattributes without git-nested's block, then add the block again
|
|
806
|
+
git-nested->>Git: commit --no-edit
|
|
807
|
+
Note over git-nested: Stop on other conflicts. --continue goes on here
|
|
808
|
+
opt A submodule pull stopped before
|
|
809
|
+
Note over git-nested: --continue finishes it there, then runs commit
|
|
810
|
+
end
|
|
811
|
+
|
|
812
|
+
loop For each submodule upstream changed
|
|
813
|
+
alt moved
|
|
814
|
+
git-nested->>Git: mv <old> <new>
|
|
815
|
+
else removed
|
|
816
|
+
git-nested->>Git: rm -r <path>
|
|
817
|
+
else added
|
|
818
|
+
Note over git-nested: Same as clone. Not for update = none
|
|
819
|
+
else new pin
|
|
820
|
+
Note over git-nested: Same as pull -b <pin> -u. Skipped if it has a pin
|
|
821
|
+
end
|
|
822
|
+
git-nested->>Git: commit
|
|
823
|
+
end
|
|
824
|
+
|
|
825
|
+
opt --single-commit
|
|
826
|
+
git-nested->>Git: reset --soft <merge commit>
|
|
827
|
+
git-nested->>Git: commit --amend
|
|
828
|
+
end
|
|
829
|
+
```
|
|
830
|
+
|
|
731
831
|
## diff
|
|
732
832
|
|
|
733
833
|
```mermaid
|
|
@@ -770,6 +870,131 @@ sequenceDiagram
|
|
|
770
870
|
|
|
771
871
|
---
|
|
772
872
|
|
|
873
|
+
## verify
|
|
874
|
+
|
|
875
|
+
```mermaid
|
|
876
|
+
sequenceDiagram
|
|
877
|
+
participant User
|
|
878
|
+
participant git-nested
|
|
879
|
+
participant Git
|
|
880
|
+
|
|
881
|
+
User->>git-nested: git nested verify <subdir> [--patches <patch>...]
|
|
882
|
+
git-nested->>Git: rev-parse --show-prefix
|
|
883
|
+
Note over git-nested: Below the top level: rev-parse --show-toplevel,<br/>paths rebased, then run from there
|
|
884
|
+
git-nested->>Git: rev-parse --git-dir
|
|
885
|
+
git-nested->>Git: rev-parse --git-dir
|
|
886
|
+
git-nested->>Git: symbolic-ref --short --quiet HEAD
|
|
887
|
+
git-nested->>Git: rev-parse --is-inside-work-tree
|
|
888
|
+
git-nested->>Git: rev-parse HEAD
|
|
889
|
+
Note over git-nested: Read .gitnested config
|
|
890
|
+
|
|
891
|
+
git-nested->>Git: rev-parse HEAD:<subdir>
|
|
892
|
+
git-nested->>Git: rev-list <commit>^{commit} -1
|
|
893
|
+
opt upstream commit not here
|
|
894
|
+
git-nested->>Git: fetch --no-tags --quiet <remote> <branch>
|
|
895
|
+
git-nested->>Git: rev-parse FETCH_HEAD^0
|
|
896
|
+
git-nested->>Git: update-ref refs/nested/<subref>/fetch FETCH_HEAD^0
|
|
897
|
+
end
|
|
898
|
+
opt path, filter or exclude configured
|
|
899
|
+
Note over git-nested: Build a commit with only the nested part of upstream
|
|
900
|
+
git-nested->>Git: commit-tree -p <commit> <tree>
|
|
901
|
+
end
|
|
902
|
+
|
|
903
|
+
git-nested->>Git: worktree add --detach --no-checkout .git/tmp/verify/<subref> <base>
|
|
904
|
+
git-nested->>Git: reset -q --hard (in the worktree)
|
|
905
|
+
Note over git-nested: A file a checkout made CRLF is applied as an LF copy
|
|
906
|
+
alt patches
|
|
907
|
+
git-nested->>Git: -c core.hooksPath=<empty> am -3 --quiet --no-gpg-sign --keep-cr <patch>... (in the worktree)
|
|
908
|
+
else diffs
|
|
909
|
+
loop For each diff
|
|
910
|
+
git-nested->>Git: apply --index <file> (in the worktree)
|
|
911
|
+
end
|
|
912
|
+
end
|
|
913
|
+
git-nested->>Git: commit --allow-empty --no-verify (in the worktree)
|
|
914
|
+
git-nested->>Git: diff --quiet HEAD <local tree> -- . ':(exclude,glob)**/.gitnested*' [':(exclude,literal)<path>']
|
|
915
|
+
Note over git-nested: Left out: the patches folder, inner nested repos, patches-ignore and --ignore paths
|
|
916
|
+
Note over git-nested: The diffs below use the same paths
|
|
917
|
+
|
|
918
|
+
opt it differs
|
|
919
|
+
git-nested->>Git: diff --stat HEAD <local tree>
|
|
920
|
+
alt patches
|
|
921
|
+
git-nested->>Git: diff --binary --full-index --output=<file> HEAD <local tree>
|
|
922
|
+
git-nested->>Git: apply --index <file>
|
|
923
|
+
git-nested->>Git: commit -m 'TODO: title' -m 'TODO: description'
|
|
924
|
+
git-nested->>Git: format-patch --zero-commit --no-signature -1 --start-number=<n> -o <dir> HEAD
|
|
925
|
+
else diff with --output
|
|
926
|
+
git-nested->>Git: diff --binary --output=<file> <base> <local tree>
|
|
927
|
+
end
|
|
928
|
+
end
|
|
929
|
+
|
|
930
|
+
git-nested->>Git: worktree prune
|
|
931
|
+
Note over git-nested: The worktree is removed, unless --keep
|
|
932
|
+
```
|
|
933
|
+
|
|
934
|
+
---
|
|
935
|
+
|
|
936
|
+
## patches
|
|
937
|
+
|
|
938
|
+
```mermaid
|
|
939
|
+
sequenceDiagram
|
|
940
|
+
participant User
|
|
941
|
+
participant git-nested
|
|
942
|
+
participant Git
|
|
943
|
+
|
|
944
|
+
User->>git-nested: git nested patches create|verify|drop <subdir>
|
|
945
|
+
git-nested->>Git: rev-parse --show-prefix
|
|
946
|
+
Note over git-nested: Below the top level: rev-parse --show-toplevel,<br/>paths rebased, then run from there
|
|
947
|
+
git-nested->>Git: rev-parse --git-dir
|
|
948
|
+
git-nested->>Git: rev-parse --git-dir
|
|
949
|
+
git-nested->>Git: symbolic-ref --short --quiet HEAD
|
|
950
|
+
git-nested->>Git: rev-parse --is-inside-work-tree
|
|
951
|
+
git-nested->>Git: rev-parse HEAD
|
|
952
|
+
Note over git-nested: Read .gitnested config. Refuse if the patches are off or do not work with the setup
|
|
953
|
+
|
|
954
|
+
git-nested->>Git: rev-parse HEAD:<subdir>
|
|
955
|
+
git-nested->>Git: rev-list <commit>^{commit} -1
|
|
956
|
+
opt upstream commit not here
|
|
957
|
+
git-nested->>Git: fetch --no-tags --quiet <remote> <branch>
|
|
958
|
+
git-nested->>Git: rev-parse FETCH_HEAD^0
|
|
959
|
+
git-nested->>Git: update-ref refs/nested/<subref>/fetch FETCH_HEAD^0
|
|
960
|
+
end
|
|
961
|
+
|
|
962
|
+
git-nested->>Git: worktree add --detach --no-checkout .git/tmp/patches/<subref> <commit>
|
|
963
|
+
git-nested->>Git: reset -q --hard (in the worktree)
|
|
964
|
+
opt the folder has patches (not with create --force)
|
|
965
|
+
Note over git-nested: A patch file a checkout made CRLF is applied as an LF copy
|
|
966
|
+
git-nested->>Git: -c core.hooksPath=<empty> am -3 --quiet --no-gpg-sign --keep-cr <patch>... (in the worktree)
|
|
967
|
+
end
|
|
968
|
+
git-nested->>Git: diff --stat HEAD <local tree> -- . ':(exclude,glob)**/.gitnested*' [':(exclude,literal)<path>']
|
|
969
|
+
Note over git-nested: Left out: the patches folder, inner nested repos and patches-ignore paths
|
|
970
|
+
|
|
971
|
+
opt create, and HEAD has more
|
|
972
|
+
git-nested->>Git: diff --binary --full-index --output=<file> HEAD <local tree>
|
|
973
|
+
git-nested->>Git: apply --index <file>
|
|
974
|
+
git-nested->>Git: commit -m 'TODO: title' -m 'TODO: description'
|
|
975
|
+
end
|
|
976
|
+
git-nested->>Git: format-patch --zero-commit --no-signature --no-numbered --no-cover-letter -o <scratch> <commit>..HEAD
|
|
977
|
+
Note over git-nested: Compare with the folder, byte for byte
|
|
978
|
+
alt create
|
|
979
|
+
Note over git-nested: Replace the patches in the folder if they differ
|
|
980
|
+
else verify
|
|
981
|
+
Note over git-nested: Fail if a change is not in a patch, or a patch differs
|
|
982
|
+
end
|
|
983
|
+
|
|
984
|
+
git-nested->>Git: worktree prune
|
|
985
|
+
|
|
986
|
+
opt drop <patch>...
|
|
987
|
+
Note over git-nested: Refuse a dirty working tree, and changes the patches do not hold
|
|
988
|
+
git-nested->>Git: worktree add --detach --no-checkout <tmp> <commit>
|
|
989
|
+
git-nested->>Git: am -3 --keep-cr <the other patches> (in the worktree)
|
|
990
|
+
git-nested->>Git: read-tree --prefix=<subdir> -u <result>
|
|
991
|
+
git-nested->>Git: format-patch --zero-commit --no-signature -o <folder> <commit>..<result>
|
|
992
|
+
git-nested->>Git: commit --no-verify -m '<subdir>: drop the patch <name>'
|
|
993
|
+
end
|
|
994
|
+
```
|
|
995
|
+
|
|
996
|
+
---
|
|
997
|
+
|
|
773
998
|
## clean
|
|
774
999
|
|
|
775
1000
|
```mermaid
|
|
@@ -64,6 +64,8 @@ One module per command, for example `commands/pull.py`. Each has one
|
|
|
64
64
|
| `history.py` | rebuilds the nested history: the core algorithm |
|
|
65
65
|
| `content.py` | creates the nested branch, places its content, commits |
|
|
66
66
|
| `filters.py` | applies `filter` and `exclude` |
|
|
67
|
+
| `patches.py` | keeps local changes as patch files: reads, applies and writes them |
|
|
68
|
+
| `patchbuild.py` | builds and checks patches in a temporary worktree |
|
|
67
69
|
| `gitfile.py` | reads and writes `.gitnested`, and the level files |
|
|
68
70
|
| `refs.py` | names of the nested branches and refs |
|
|
69
71
|
| `worktree.py` | temporary worktrees and their branches |
|
|
@@ -25,6 +25,13 @@ Use it to:
|
|
|
25
25
|
- fix up the history before a push,
|
|
26
26
|
- finish a pull by hand. See [Resolve conflicts](../guides/conflicts.md).
|
|
27
27
|
|
|
28
|
+
With `--from-patches`, the branch is built from the patches instead of the
|
|
29
|
+
history: the upstream commit from `.gitnested`, and one commit per patch on
|
|
30
|
+
top. Each commit has the author, date and message of its patch. Then
|
|
31
|
+
`branch` checks that the result is what HEAD has in `<subdir>`. It stops if
|
|
32
|
+
a change is not in a patch yet, or if a patch is missing. Then
|
|
33
|
+
[`patches create`](patches.md) writes the missing patch.
|
|
34
|
+
|
|
28
35
|
Other changes in your working tree do not block it. If `<subdir>` has
|
|
29
36
|
uncommitted changes, `branch` warns and ignores them.
|
|
30
37
|
|
|
@@ -43,6 +50,7 @@ uncommitted changes, `branch` warns and ignores them.
|
|
|
43
50
|
| `-n`, `--name <name>` | name the branch. Default: `nested/<subdir>` |
|
|
44
51
|
| `-F`, `--fetch` | fetch upstream first |
|
|
45
52
|
| `-f`, `--force` | build the branch again if it exists |
|
|
53
|
+
| `--from-patches` | build the branch from upstream and the patches. Stop if they do not give `<subdir>` |
|
|
46
54
|
| `-S`, `--gpg-sign` | GPG-sign the rebuilt nested commits |
|
|
47
55
|
|
|
48
56
|
## Examples
|
|
@@ -52,6 +60,7 @@ git nested branch ext/lib
|
|
|
52
60
|
git nested branch -d ../lib ext/lib
|
|
53
61
|
git nested branch --name lib-fixes ext/lib
|
|
54
62
|
git nested branch --all
|
|
63
|
+
git nested branch --from-patches ext/lib
|
|
55
64
|
```
|
|
56
65
|
|
|
57
66
|
Then work in the worktree:
|
|
@@ -87,6 +96,8 @@ A name from `--name` is stored in `.git/config`, as
|
|
|
87
96
|
or use `--name`.
|
|
88
97
|
- `--name` can not be the name of a branch git-nested does not own.
|
|
89
98
|
- `--dir` and `--name` can not be used with `--all`.
|
|
99
|
+
- `--from-patches` can not be used with `-S`: the patch commits are not
|
|
100
|
+
signed. It does not work with `filter`, `exclude` or `path` yet.
|
|
90
101
|
|
|
91
102
|
## See also
|
|
92
103
|
|
|
@@ -111,8 +111,16 @@ If nothing changed, it does nothing and says "already up to date".
|
|
|
111
111
|
- `--adopt` can not be used with `--filter` or `--recurse-submodules`.
|
|
112
112
|
- Without `--recurse-submodules`, submodules of upstream stay empty, and
|
|
113
113
|
git-nested warns about it. See [Upstream submodules](../guides/submodules.md).
|
|
114
|
+
- If your `.gitattributes` would change files of the nested repository,
|
|
115
|
+
for example `*.bat text eol=crlf`, `clone` and `pull` add `-text` for
|
|
116
|
+
these files to `.gitattributes`, in a commit of their own. So the files
|
|
117
|
+
stay as upstream has them, in git and in your checkout.
|
|
118
|
+
- With `--recurse-submodules`, a submodule with `update = none` in
|
|
119
|
+
`.gitmodules` stays a submodule, as in git.
|
|
114
120
|
- If upstream is empty, `clone` stops. Use [`init`](init.md) and then
|
|
115
121
|
[`push`](push.md) to fill it.
|
|
122
|
+
- With [patches](../guides/patches.md), `--force` starts over: it takes
|
|
123
|
+
upstream and empties the patches folder. The local changes are gone.
|
|
116
124
|
|
|
117
125
|
## See also
|
|
118
126
|
|
|
@@ -31,6 +31,7 @@ It needs a clean working tree, and a worktree of the nested branch.
|
|
|
31
31
|
| `-f`, `--force` | commit even if the branch does not contain the fetched upstream commit |
|
|
32
32
|
| `-m`, `--message <message>` | the commit message |
|
|
33
33
|
| `--file <file>` | read the commit message from a file |
|
|
34
|
+
| `--pin <commit>` | record this pin in `.gitnested`. The help of a conflicted `pull --pin` passes it |
|
|
34
35
|
| `-S`, `--gpg-sign` | GPG-sign the commit |
|
|
35
36
|
| `--signoff` | add a `Signed-off-by:` trailer to the commit |
|
|
36
37
|
|
|
@@ -47,6 +48,9 @@ git nested commit --file=msg.txt ext/lib
|
|
|
47
48
|
it. Or pass `-F`.
|
|
48
49
|
- The branch must contain the fetched upstream commit. Otherwise upstream
|
|
49
50
|
changes would be lost. `--force` skips this check.
|
|
51
|
+
- Nested repositories inside `<subdir>` stay nested, with your changes.
|
|
52
|
+
Then each one is pulled to the commit that upstream pins now, as `pull`
|
|
53
|
+
does.
|
|
50
54
|
|
|
51
55
|
## See also
|
|
52
56
|
|
|
@@ -43,6 +43,10 @@ instead of editing the file by hand.
|
|
|
43
43
|
| `pin` | a commit or tag of the branch to nest, instead of its newest commit | yes |
|
|
44
44
|
| `cmdver` | the git-nested version that last wrote this file | no |
|
|
45
45
|
| `readonly` | `true` makes push refuse, for a repository that is only pulled | yes |
|
|
46
|
+
| `patches` | the folder with the local changes as patches, relative to the subdir | yes |
|
|
47
|
+
| `patches-ignore` | paths in the subdir that stay local, so no patch needs their changes | no |
|
|
48
|
+
| `patches-local` | patches a push leaves out, by file name | no |
|
|
49
|
+
| `submodules` | `nest` or `keep`: whether a pull nests the submodules in it. Unset: nest | yes |
|
|
46
50
|
|
|
47
51
|
The other keys are written by the commands themselves. Setting one by hand
|
|
48
52
|
would describe a state the repository is not in.
|
|
@@ -65,5 +69,5 @@ git commit -m "lib: pull with rebase, never push"
|
|
|
65
69
|
- A relative path as a `remote` value is taken relative to the folder you
|
|
66
70
|
are in, like git does. It is stored relative to the top of your
|
|
67
71
|
repository.
|
|
68
|
-
- An unknown key, or a bad value for `method`, `squash
|
|
69
|
-
refused.
|
|
72
|
+
- An unknown key, or a bad value for `method`, `squash`, `readonly` or
|
|
73
|
+
`submodules`, is refused.
|
|
@@ -16,7 +16,10 @@ Each command has its own page. This page lists what they share.
|
|
|
16
16
|
| [`push`](push.md) | push a nested repository's local changes upstream |
|
|
17
17
|
| [`fetch`](fetch.md) | fetch upstream content for a nested repository |
|
|
18
18
|
| [`status`](status.md) | report on the nested repositories of this repository |
|
|
19
|
+
| [`submodules`](submodules.md) | turn all submodules into nested repositories and keep them up to date |
|
|
19
20
|
| [`diff`](diff.md) | show a nested repository's local changes against upstream |
|
|
21
|
+
| [`patches`](patches.md) | write, check, drop or cherry-pick the patches of a nested repository |
|
|
22
|
+
| [`verify`](verify.md) | check that a nested repository is its upstream commit plus patches or diffs |
|
|
20
23
|
| [`branch`](branch.md) | create a branch holding the local nested commits |
|
|
21
24
|
| [`run`](run.md) | run a git command in the worktree of a nested repository |
|
|
22
25
|
| [`commit`](commit.md) | add a nested branch to the current history as one commit |
|
|
@@ -114,7 +117,8 @@ The details are on each command's page. In short:
|
|
|
114
117
|
| `-f`, `--force` | force the operation; what it does differs per command |
|
|
115
118
|
| `-S`, `--gpg-sign` | GPG-sign the commits git-nested makes |
|
|
116
119
|
| `--signoff` | add a `Signed-off-by:` trailer |
|
|
117
|
-
| `--single-commit` | with `--all`: one commit for all |
|
|
120
|
+
| `--single-commit` | with `--all`: one commit for all. With `submodules`: one merge commit |
|
|
121
|
+
| `--dry-run` | show what would happen; change nothing |
|
|
118
122
|
|
|
119
123
|
### `--all` and `-b`
|
|
120
124
|
|
|
@@ -91,6 +91,7 @@ git nested init --from-submodule ext/lib
|
|
|
91
91
|
This removes the submodule and clones the same URL at the same commit into
|
|
92
92
|
its place. A relative submodule URL is resolved against the `origin` remote
|
|
93
93
|
of your repository. See [Upstream submodules](../guides/submodules.md).
|
|
94
|
+
To nest all submodules at once, use [`submodules init`](submodules.md).
|
|
94
95
|
|
|
95
96
|
## Notes
|
|
96
97
|
|