원클릭으로
update-git
// Walk through updating the version of Git shipped in GitHub Desktop. This is a multi-repo process spanning dugite-native, dugite, and desktop. Use this when asked to update Git, update Git for Windows, or bump the Git version.
// Walk through updating the version of Git shipped in GitHub Desktop. This is a multi-repo process spanning dugite-native, dugite, and desktop. Use this when asked to update Git, update Git for Windows, or bump the Git version.
Instructions for writing and maintaining tests in GitHub Desktop. Covers unit tests, UI component tests, and ad-hoc E2E tests. Use this skill when implementing features or bugfixes to write relevant tests, update existing tests, run the full suite to check for regressions, and produce screenshots and videos for Pull Request documentation.
Assigns a GitHub issue to the Copilot coding agent, optionally specifying a custom agent. Use this when asked to assign an issue to Copilot or delegate an issue to CCA.
| name | update-git |
| description | Walk through updating the version of Git shipped in GitHub Desktop. This is a multi-repo process spanning dugite-native, dugite, and desktop. Use this when asked to update Git, update Git for Windows, or bump the Git version. |
This skill guides the user through updating the version of Git that GitHub Desktop ships. This is a multi-repo cascade:
Each step must complete (PR merged + release published) before the next can begin.
Before starting, use <skill-directory>/check-versions.sh to show the user
what's currently shipped and what's available. Then ask the user which
components they want to update.
Even if the user only asks about one component (e.g., Git for Windows), proactively check all components and recommend bundling any other available updates. This avoids having to reship dugite-native if a test fails due to a version mismatch in a component the user didn't update.
Gather the following:
v2.48.0) — or latestv2.48.0.windows.1) — or latestskip if not updating (default: skip)skip if not updating (default:
skip)Use the helper script to trigger the workflow:
bash <skill-directory>/trigger-workflow.sh dugite-native update-dependencies \
git=<GIT_VERSION> g4w=<G4W_VERSION> lfs=<LFS_VERSION> gcm=<GCM_VERSION>
This triggers the Update dependencies workflow in desktop/dugite-native
which will:
dependencies.json with new URLs and checksumsImportant: The Git and Git for Windows updates are handled by the same
workflow step. If you only want to update Git for Windows, you must still pass
the current Git version (not skip) for the git input, otherwise the step
will be skipped entirely. Use <skill-directory>/check-versions.sh to find the
current Git version and pass it as the git input. For example, if Git is
currently at v2.53.0 and you only want to update GfW:
bash <skill-directory>/trigger-workflow.sh dugite-native update-dependencies \
git=v2.53.0 g4w=v2.53.0.windows.2 lfs=skip gcm=skip
Tell the user to:
bash <skill-directory>/check-workflow.sh dugite-native
bash <skill-directory>/open-pr.sh dugite-native
gh pr merge --auto --squash <PR_NUMBER> --repo desktop/dugite-native
Tell the user: "I've enabled auto-merge — please review the PR before CI
finishes so it can merge automatically."Do not proceed to Step 2 until the PR is merged.
Use the helper script to trigger the release workflow:
bash <skill-directory>/trigger-workflow.sh dugite-native release \
version=<VERSION_TAG> draft=false prerelease=false dry-run=true
Suggest running with dry-run=true first. If it succeeds, re-run with
dry-run=false.
The version tag should follow Git's versioning scheme:
v2.48.0 for a new Git versionv2.48.0-1 if only packaging or other dependencies changedTell the user to:
Use this to check if the release exists:
bash <skill-directory>/check-release.sh dugite-native <VERSION_TAG>
Do not proceed to Step 3 until the release is published.
Trigger the Update Git workflow:
bash <skill-directory>/trigger-workflow.sh dugite update-git
No inputs are needed — it automatically fetches the latest dugite-native release.
The workflow creates a PR that updates script/embedded-git.json. Tell the user
to:
bash <skill-directory>/open-pr.sh dugite
gh pr merge --auto --squash <PR_NUMBER> --repo desktop/dugite
Tell the user: "I've enabled auto-merge — please review the PR before CI
finishes so it can merge automatically."Do not proceed to Step 4 until the PR is merged.
Trigger the Publish workflow:
bash <skill-directory>/trigger-workflow.sh dugite publish \
version=<SEMVER_BUMP> tag=latest dry-run=true
minor for a new Git version, patch for bugfix-onlylatest for stable, next for pre-releasesSuggest running with dry-run=true first, then dry-run=false.
Verify the package was published:
bash <skill-directory>/check-npm.sh dugite
Do not proceed to Step 5 until the npm package is published.
Before proceeding, ask the user what they want to do with the dugite update:
Important: Desktop has a nested package structure. The dugite dependency
lives in app/package.json, not the root package.json. Do NOT run
yarn upgrade dugite from the repo root — it will add dugite to the wrong
package.json.
cd <desktop-repo-path>
git checkout development && git pull
git checkout -b update-dugite-<NEW_VERSION>
# Edit app/package.json to set dugite to "^<NEW_VERSION>"
cd app && yarn install && cd ..
yarn why dugite
git add app/package.json app/yarn.lock
git commit -m "Update dugite to <NEW_VERSION>"
git push origin HEAD
gh pr create --title "Update dugite to <NEW_VERSION> (Git <GIT_VERSION>)" \
--base development --draft
If the user wants to cut a production release (e.g., from an existing beta tag
like release-3.5.6-beta1):
development:
cd <desktop-repo-path>
git fetch --tags
git tag --sort=-v:refname | grep "release-.*-beta" | head -1
git checkout <latest-beta-tag>
yarn draft-release production
This will:
releases/<version> branch from the beta tagapp/package.jsonapp/package.json directly
(see note below about the nested package structure):
# Edit app/package.json to set dugite to "^<NEW_VERSION>"
cd app && yarn install && cd ..
[Improved] Update Git for Windows to <GFW_VERSION>) and that
version numbers reflect what's actually in this release, not what was in the
betagit add app/package.json app/yarn.lock changelog.json
git commit -m "Bump version and add changelog"
If building from a specific tag, ask the user which tag or branch they're basing the release on.
git checkout development && git pull
git checkout -b update-dugite-<NEW_VERSION>
# Edit app/package.json to set dugite to "^<NEW_VERSION>"
cd app && yarn install && cd ..
git add app/package.json app/yarn.lock
git commit -m "Update dugite to <NEW_VERSION>"
git push origin HEAD
gh pr create --title "Update dugite to <NEW_VERSION> (Git <GIT_VERSION>)" \
--base development
Merge the PR once CI passes.yarn draft-release beta
This will:
releases/<version> branchapp/package.jsonA common pattern is to release production first, then immediately cut a beta that includes the same changes on the development branch. If the user mentions this, walk them through both in sequence:
bash <skill-directory>/open-pr.sh <repo>
check-workflow.sh and give the user a brief status
update each time (e.g., "Still running — 45s elapsed, Linux arm64 building").
Do not wait for the user to ask — keep polling until the workflow completes
or fails. When checking individual job status, use:
gh run view <RUN_ID> --repo desktop/<REPO> --json status,jobs \
--jq '.jobs[] | select(.status != "completed") | "\(.name): \(.status)"'