diff --git a/packages/docusaurus/bin/docusaurus.mjs b/packages/docusaurus/bin/docusaurus.mjs
index cd53d42d5952..7429f4f4156e 100755
--- a/packages/docusaurus/bin/docusaurus.mjs
+++ b/packages/docusaurus/bin/docusaurus.mjs
@@ -115,6 +115,10 @@ cli
'--skip-build',
'skip building website before deploy it (default: false)',
)
+ .option(
+ '--target-dir
',
+ 'path to the target directory to deploy to (default: `.`)',
+ )
.action(deploy);
/**
diff --git a/packages/docusaurus/src/commands/deploy.ts b/packages/docusaurus/src/commands/deploy.ts
index e16f4881552b..2e23a8e3efb1 100644
--- a/packages/docusaurus/src/commands/deploy.ts
+++ b/packages/docusaurus/src/commands/deploy.ts
@@ -19,6 +19,7 @@ export type DeployCLIOptions = Pick<
'config' | 'locale' | 'outDir'
> & {
skipBuild?: boolean;
+ targetDir?: string;
};
// GIT_PASS env variable should not appear in logs
@@ -185,32 +186,33 @@ You can also set the deploymentBranch property in docusaurus.config.js .`);
const currentCommit = shellExecLog('git rev-parse HEAD').stdout.trim();
const runDeploy = async (outputDirectory: string) => {
+ const targetDirectory = cliOptions.targetDir ?? '.';
const fromPath = outputDirectory;
const toPath = await fs.mkdtemp(
path.join(os.tmpdir(), `${projectName}-${deploymentBranch}`),
);
shell.cd(toPath);
- // Check out deployment branch when cloning repository, and then remove all
- // the files in the directory. If the 'clone' command fails, assume that
- // the deployment branch doesn't exist, and initialize git in an empty
- // directory, check out a clean deployment branch and add remote.
+ // Clones the repo into the temp folder and checks out the target branch.
+ // If the branch doesn't exist, it creates a new one based on the
+ // repository default branch.
if (
shellExecLog(
`git clone --depth 1 --branch ${deploymentBranch} ${deploymentRepoURL} "${toPath}"`,
- ).code === 0
+ ).code !== 0
) {
- shellExecLog('git rm -rf .');
- } else {
- shellExecLog('git init');
+ shellExecLog(`git clone --depth 1 ${deploymentRepoURL} "${toPath}"`);
shellExecLog(`git checkout -b ${deploymentBranch}`);
- shellExecLog(`git remote add origin ${deploymentRepoURL}`);
}
+ // Clear out any existing contents in the target directory
+ shellExecLog(`git rm -rf ${targetDirectory}`);
+
+ const targetPath = path.join(toPath, targetDirectory);
try {
- await fs.copy(fromPath, toPath);
+ await fs.copy(fromPath, targetPath);
} catch (err) {
- logger.error`Copying build assets from path=${fromPath} to path=${toPath} failed.`;
+ logger.error`Copying build assets from path=${fromPath} to path=${targetPath} failed.`;
throw err;
}
shellExecLog('git add --all');
@@ -254,7 +256,8 @@ You can also set the deploymentBranch property in docusaurus.config.js .`);
if (!cliOptions.skipBuild) {
// Build site, then push to deploymentBranch branch of specified repo.
try {
- await build(siteDir, cliOptions, false).then(() => runDeploy(outDir));
+ await build(siteDir, cliOptions, false);
+ await runDeploy(outDir);
} catch (err) {
logger.error('Deployment of the build output failed.');
throw err;
diff --git a/website/docs/cli.mdx b/website/docs/cli.mdx
index 369779788afa..5be24e5191b5 100644
--- a/website/docs/cli.mdx
+++ b/website/docs/cli.mdx
@@ -144,6 +144,7 @@ Deploys your site with [GitHub Pages](https://pages.github.com/). Check out the
| `--locale` | | Deploy the site in the specified locale. If not specified, all known locales are deployed. |
| `--out-dir` | `build` | The full path for the new output directory, relative to the current workspace. |
| `--skip-build` | `false` | Deploy website without building it. This may be useful when using a custom deploy script. |
+| `--target-dir` | `.` | Path to the target directory to deploy to. |
| `--config` | `undefined` | Path to Docusaurus config file, default to `[siteDir]/docusaurus.config.js` |
### `docusaurus serve [siteDir]` {#docusaurus-serve-sitedir}