Skip to content

Repo sync #37182

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 9 commits into from
Mar 31, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
# ---------------------------------------------------------------
# To update the sha:
# https://github.com/github/gh-base-image/pkgs/container/gh-base-image%2Fgh-base-noble
FROM ghcr.io/github/gh-base-image/gh-base-noble:20250319-193531-g83d4e6244 AS base
FROM ghcr.io/github/gh-base-image/gh-base-noble:20250328-000607-gf66d47491 AS base

# Install curl for Node install and determining the early access branch
# Install git for cloning docs-early-access & translations repos
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ Most programming languages have a package that can generate a JWT. In all cases,
> [!NOTE]
> You must run `gem install jwt` to install the `jwt` package in order to use this script.

In the following example, replace `YOUR_PATH_TO_PEM` with the file path where your private key is stored. Replace `YOUR_APP_ID` with the ID of your app. Make sure to enclose the values for `YOUR_PATH_TO_PEM` and `YOUR_APP_ID` in double quotes.
In the following example, replace `YOUR_PATH_TO_PEM` with the file path where your private key is stored. Replace {% ifversion client-id-for-app %}`YOUR_CLIENT_ID`{% else %}`YOUR_APP_ID`{% endif %} with the ID of your app. Make sure to enclose the values for `YOUR_PATH_TO_PEM` and {% ifversion client-id-for-app %}`YOUR_CLIENT_ID`{% else %}`YOUR_APP_ID`{% endif %} in double quotes.

```ruby
require 'openssl'
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@ To drive accountability and control costs, the new billing platform lets you cre

If your account is billed to Azure, you will have the option to add an Azure subscription ID. Cost centers allows for multiple Azure subscription IDs so that different business units, within an enterprise, can directly pay for their usage.

To learn more about roles authorized to create and manage cost centers, see [AUTOTITLE](/billing/using-the-new-billing-platform/roles-for-the-new-billing-platform).

## Creating a cost center

Create cost centers to monitor and manage expenses for specific organizations or repositories. Multiple organizations, repositories, and users can be assigned to one cost center.
Expand Down Expand Up @@ -167,6 +169,16 @@ The following table illustrates how spending for each user is allocated to a cos

{% endrowheaders %}

## Limitations of the cost center API

There are a few current limitations when working with cost centers and the API:

* You **cannot** create cost centers using the API. Administrators must create them through the UI.
* Once a cost center is created in the UI, administrators can use the API to add **members** only.
* It’s **not currently possible** to add **organizations** or **repositories** to cost centers using the API.
* You **cannot** add members to cost centers through the UI.
* A single **organization**, **repository**, or **member** can only be assigned to one cost center at a time.

## Further reading

* [AUTOTITLE](/rest/enterprise-admin/billing)
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ Using {% data variables.product.prodname_actions %} runners allows you to more e
You can run {% data variables.product.prodname_dependabot %} on {% data variables.product.prodname_actions %} using:
* {% data variables.product.prodname_dotcom %}-hosted runners
* {% data variables.actions.hosted_runners_caps %}. These runners are {% data variables.product.prodname_dotcom %}-hosted, with advanced features, such as more RAM, CPU, and disk space. For more information, see [AUTOTITLE](/actions/using-github-hosted-runners/about-larger-runners).
* Self-hosted runners
* Self-hosted runners. For more information on assigning a `dependabot` label on self-hosted runners, see [AUTOTITLE](/code-security/dependabot/maintain-dependencies/managing-dependabot-on-self-hosted-runners).

{% data reusables.dependabot.vnet-arc-note %}

Expand Down
10 changes: 0 additions & 10 deletions content/migrations/overview/about-locked-repositories.md
Original file line number Diff line number Diff line change
Expand Up @@ -53,16 +53,6 @@ If you're sure you want to use the repository, a site administrator can unlock t

The source repository is not locked by default, only if the `--lock` argument is specified when preparing the repository for export with the `ghe-migrator add` command. To unlock the repository, use the `ghe-migrator unlock` command. For more information, see [AUTOTITLE](/migrations/using-ghe-migrator/migrating-data-to-github-enterprise-server#unlocking-repositories-on-the-source).

## Repositories locked by Enterprise Cloud Importer

When you use Enterprise Cloud Importer, the destination repository is locked by default and is not automatically unlocked.

If the import succeeded, you can unlock the repository by clicking the **Unlock** button in Enterprise Cloud Importer.

If the import failed, you cannot unlock the repository yourself. Because a failed migration means that not all of your data has been migrated, we recommend deleting the repository and retrying the migration, to prevent data loss.

If you’re sure you want to unlock the repository, contact {% data variables.contact.contact_support %}.

## Repositories locked by the `startImport` GraphQL mutation

When you use the `startImport` GraphQL mutation, the destination repository is locked by default and is not automatically unlocked.
Expand Down
15 changes: 11 additions & 4 deletions content/migrations/overview/migration-paths-to-github.md
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,13 @@ Some migration paths require tools that are only available with expert-led migra

In our recommendations, we'll assume that you want the highest level of fidelity if possible, which includes source, history, and metadata.

<!-- expires 2025-06-30 -->

> [!NOTE]
> Enterprise Cloud Importer (ECI) and the GraphQL endpoints for importing migration data to {% data variables.product.prodname_ghe_cloud %} from an archive are closing down on March 31, 2025. After this date, these tools can not be used to import repository data into GitHub's cloud-based products. We recommend using {% data variables.product.prodname_importer_proper_name %} (GEI). See [AUTOTITLE](/migrations/using-github-enterprise-importer/understanding-github-enterprise-importer/about-github-enterprise-importer).

<!-- end expires 2025-06-30 -->

## Migrations to {% data variables.product.prodname_dotcom_the_website %}

You can review the scope and tooling for your migration to {% data variables.product.prodname_dotcom_the_website %}, which includes migrations to {% data variables.product.prodname_ghe_cloud %}. You can also review any additional information or caveats.
Expand Down Expand Up @@ -104,16 +111,16 @@ Migrations from {% data variables.product.prodname_dotcom_the_website %} include
* [AUTOTITLE](/migrations/using-github-enterprise-importer)
* [{% data variables.product.prodname_expert_services %}](https://github.com/services/) website
* **Caveats:**
* For complex repositories larger than around 5 GB, you may need to use `bbs-exporter` and Enterprise Cloud Importer instead. Enterprise Cloud Importer is only available for expert-led migrations.
* {% data reusables.migrations.large-repositories-require-expert-services %}
* {% data reusables.migrations.migration-instructions-for-any-git-repository-to-githubcom %}

### GitLab to {% data variables.product.prodname_dotcom_the_website %}

* **Scope:** Source, history, and metadata
* **Tooling:** `gl-exporter`, then Enterprise Cloud Importer (expert-led migrations only)
* **Tooling:** {% data variables.product.prodname_importer_proper_name %}
* **More information:** [{% data variables.product.prodname_expert_services %}](https://github.com/services/) website
* **Caveats:**
* Enterprise Cloud Importer is only available for expert-led migrations.
* If you want to migrate GitLab repositories to GitHub using {% data variables.product.prodname_importer_proper_name %}, please contact our {% data variables.product.prodname_expert_services %} team.
* {% data reusables.migrations.migration-instructions-for-any-git-repository-to-githubcom %}

### Any Git repository to {% data variables.product.prodname_dotcom_the_website %}
Expand Down Expand Up @@ -164,7 +171,7 @@ This path is not currently supported with our official tools. Please contact {%

If you're migrating to {% data variables.enterprise.data_residency %}, your migration destination is {% data variables.enterprise.data_residency_site %}.

Migrations to {% data variables.enterprise.data_residency_site %} use similar tools as migrations to {% data variables.product.prodname_dotcom_the_website %}. However, the {% data variables.product.prodname_importer %} and Enterprise Cloud Importer are not available.
Migrations to {% data variables.enterprise.data_residency_site %} use similar tools as migrations to {% data variables.product.prodname_dotcom_the_website %}. However, the {% data variables.product.prodname_importer %} is not available.

Follow a link below to review the scope and tooling for your migration to {% data variables.enterprise.data_residency_site %}, plus any additional information or caveats.

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,9 @@ You may be verifying a domain you own, which is currently in use by another user

## Verifying a domain for your user site

> [!NOTE]
> If you don’t see the options described below, make sure you’re in your **Profile settings**, not your repository settings. Domain verification happens at the profile level.

{% data reusables.user-settings.access_settings %}
1. In the "Code, planning, and automation" section of the sidebar, click **{% octicon "browser" aria-hidden="true" %} Pages**.
{% data reusables.pages.settings-verify-domain-setup %}
Expand All @@ -43,6 +46,9 @@ You may be verifying a domain you own, which is currently in use by another user

Organization owners can verify custom domains for their organization.

> [!NOTE]
> If you don’t see the options described below, check that you’re in your **Organization settings**. Domain verification doesn’t take place in repository settings.

{% data reusables.profile.access_org %}
{% data reusables.profile.org_settings %}
1. In the "Code, planning, and automation" section of the sidebar, click **{% octicon "browser" aria-hidden="true" %} Pages**.
Expand Down
Original file line number Diff line number Diff line change
@@ -1 +1 @@
For complex repositories larger than around 5 GB, you may need to use `ghe-migrator` and Enterprise Cloud Importer instead. Enterprise Cloud Importer is only available for expert-led migrations.
For repositories with git or metadata archives greater than 20GB, consider engaging our {% data variables.product.prodname_expert_services %} to help bring your large repositories within Enterprise Cloud Importer limits.
3 changes: 1 addition & 2 deletions data/reusables/support/scope-of-support.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
If your support request is outside of the scope of what our team can help you with, we may recommend next steps to resolve your issue outside of {% data variables.contact.github_support %}. Your support request is possibly out of {% data variables.contact.github_support %}'s scope if the request is primarily about:

* Third party integrations, such as Jira
* Enterprise Cloud Importer (available only with expert-led migrations){% ifversion ghes %}
* Third party integrations, such as Jira{% ifversion ghes %}
* Hardware setup{% endif %}
* CI/CD, such as Jenkins
* Writing scripts
Expand Down
1 change: 1 addition & 0 deletions data/ui.yml
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@ search:
view_all_search_results: View more results
no_results_found: No results found
search_docs_with_query: Search docs for "{{query}}"
privacy_disclaimer: For product and service improvement purposes, the GitHub Docs team will retain questions and answers generated in the Docs search function. Please see the <a href="https://docs.github.com/privacy">GitHub Privacy Statement</a> to review how GitHub collects and uses your data.
ai:
disclaimer: Copilot uses AI. Check for mistakes by reviewing the links in the response.
references: References from these articles
Expand Down
1 change: 1 addition & 0 deletions src/fixtures/fixtures/data/ui.yml
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@ search:
view_all_search_results: View more results
no_results_found: No results found
search_docs_with_query: Search docs for "{{query}}"
privacy_disclaimer: For product and service improvement purposes, the GitHub Docs team will retain questions and answers generated in the Docs search function. Please see the <a href="https://docs.github.com/privacy">GitHub Privacy Statement</a> to review how GitHub collects and uses your data.
ai:
disclaimer: Copilot uses AI. Check for mistakes by reviewing the links in the response.
references: References from these articles
Expand Down
3 changes: 3 additions & 0 deletions src/search/components/input/SearchOverlay.module.scss
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,9 @@
color: var(--fgColor-success, var(--fgColor-open, green)) !important;
background-color: var(--overlay-bgColor);
margin-right: 1em;
height: 22px !important;
font-weight: 700 !important;
border-color: unset !important;
}

.loadingContainer {
Expand Down
61 changes: 42 additions & 19 deletions src/search/components/input/SearchOverlay.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import {
Overlay,
Spinner,
Stack,
Text,
TextInput,
Token,
} from '@primer/react'
Expand Down Expand Up @@ -691,28 +692,50 @@ export function SearchOverlay({
}}
/>
<footer key="description" className={styles.footer}>
<Token
as="span"
text="Beta"
className={styles.betaToken}
<Box
sx={{
backgroundColor: 'var(--overlay-bg-color)',
display: 'flex',
alignContent: 'start',
alignItems: 'start',
}}
/>
<Link
onClick={async () => {
if (await getIsStaff()) {
// Hubbers users use an internal discussion for feedback
window.open('https://github.com/github/docs-engineering/discussions/5295', '_blank')
} else {
// TODO: On ship date set this value
// window.open('TODO', '_blank')
}
}}
as="button"
>
{t('search.overlay.give_feedback')}
</Link>
<Token
as="span"
text="Beta"
className={styles.betaToken}
sx={{
backgroundColor: 'var(--overlay-bg-color)',
}}
/>
<Link
onClick={async () => {
if (await getIsStaff()) {
// Hubbers users use an internal discussion for feedback
window.open(
'https://github.com/github/docs-engineering/discussions/5295',
'_blank',
)
} else {
// TODO: On ship date set this value
// window.open('TODO', '_blank')
}
}}
as="button"
>
{t('search.overlay.give_feedback')}
</Link>
</Box>
<Text
as="p"
sx={{
// eslint-disable-next-line primer-react/new-color-css-vars
color: 'var(--color-fg-muted)',
marginTop: 2,
marginBottom: 0,
fontSize: 'small',
}}
dangerouslySetInnerHTML={{ __html: t('search.overlay.privacy_disclaimer') }}
/>
</footer>
</Overlay>
</>
Expand Down
9 changes: 8 additions & 1 deletion src/search/lib/ai-search-proxy.ts
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,14 @@ export const aiSearchProxy = async (req: Request, res: Response) => {

// Handle the upstream response before piping
stream.on('response', (upstreamResponse) => {
if (upstreamResponse.statusCode !== 200) {
// When cse-copilot returns a 204, it means the backend received the request
// but was unable to answer the question. So we return a 400 to the client to be handled.
if (upstreamResponse.statusCode === 204) {
statsd.increment('ai-search.unable_to_answer_query', 1, diagnosticTags)
return res
.status(400)
.json({ errors: [{ message: 'Sorry I am unable to answer this question.' }] })
} else if (upstreamResponse.statusCode !== 200) {
const errorMessage = `Upstream server responded with status code ${upstreamResponse.statusCode}`
console.error(errorMessage)
statsd.increment('ai-search.stream_response_error', 1, diagnosticTags)
Expand Down