Kargi-Sitesi/node_modules/gh-pages/readme.md

438 lines
12 KiB
Markdown
Raw Normal View History

2024-11-03 21:30:09 -05:00
# gh-pages
Publish files to a `gh-pages` branch on GitHub (or any other branch anywhere else).
## Getting Started
```shell
npm install gh-pages --save-dev
```
This module requires Git `>=1.9`.
## Basic Usage
```js
var ghpages = require('gh-pages');
ghpages.publish('dist', function(err) {});
```
## `publish`
```js
ghpages.publish(dir, callback);
// or...
ghpages.publish(dir, options, callback);
```
Calling this function will create a temporary clone of the current repository, create a `gh-pages` branch if one doesn't already exist, copy over all files from the base path, or only those that match patterns from the optional `src` configuration, commit all changes, and push to the `origin` remote.
If a `gh-pages` branch already exists, it will be updated with all commits from the remote before adding any commits from the provided `src` files.
**Note** that any files in the `gh-pages` branch that are *not* in the `src` files **will be removed**. See the [`add` option](#optionsadd) if you don't want any of the existing files removed.
### <a id="dir">`dir`</a>
* type: `string`
The base directory for all source files (those listed in the `src` config property).
Example use:
```js
/**
* Given the following directory structure:
*
* dist/
* index.html
* js/
* site.js
*
* The usage below will create a `gh-pages` branch that looks like this:
*
* index.html
* js/
* site.js
*
*/
ghpages.publish('dist', callback);
```
### Options
The default options work for simple cases. The options described below let you push to alternate branches, customize your commit messages, and more.
#### <a id="optionssrc">options.src</a>
* type: `string|Array<string>`
* default: `'**/*'`
The [minimatch](https://github.com/isaacs/minimatch) pattern or array of patterns used to select which files should be published.
#### <a id="optionsbranch">options.branch</a>
* type: `string`
* default: `'gh-pages'`
* `-b | --branch <branch name>`
The name of the branch you'll be pushing to. The default uses GitHub's `gh-pages` branch, but this can be configured to push to any branch on any remote.
Example use of the `branch` option:
```js
/**
* This task pushes to the `master` branch of the configured `repo`.
*/
ghpages.publish('dist', {
branch: 'master',
repo: 'https://example.com/other/repo.git'
}, callback);
```
#### <a id="optionsdest">options.dest</a>
* type: `string`
* default: `'.'`
The destination folder within the destination branch. By default, all files are published to the root of the repository.
Example use of the `dest` option:
```js
/**
* Place content in the static/project subdirectory of the target
* branch.
*/
ghpages.publish('dist', {
dest: 'static/project'
}, callback);
```
#### <a id="optionsdotfiles">options.dotfiles</a>
* type: `boolean`
* default: `false`
Include dotfiles. By default, files starting with `.` are ignored unless they are explicitly provided in the `src` array. If you want to also include dotfiles that otherwise match your `src` patterns, set `dotfiles: true` in your options.
Example use of the `dotfiles` option:
```js
/**
* The usage below will push dotfiles (directories and files)
* that otherwise match the `src` pattern.
*/
ghpages.publish('dist', {dotfiles: true}, callback);
```
#### <a id="optionsadd">options.add</a>
* type: `boolean`
* default: `false`
Only add, and never remove existing files. By default, existing files in the target branch are removed before adding the ones from your `src` config. If you want the task to add new `src` files but leave existing ones untouched, set `add: true` in your options.
Example use of the `add` option:
```js
/**
* The usage below will only add files to the `gh-pages` branch, never removing
* any existing files (even if they don't exist in the `src` config).
*/
ghpages.publish('dist', {add: true}, callback);
```
#### <a id="optionsrepo">options.repo</a>
* type: `string`
* default: url for the origin remote of the current dir (assumes a git repository)
* `-r | --repo <repo url>`
By default, `gh-pages` assumes that the current working directory is a git repository, and that you want to push changes to the `origin` remote.
If instead your script is not in a git repository, or if you want to push to another repository, you can provide the repository URL in the `repo` option.
Example use of the `repo` option:
```js
/**
* If the current directory is not a clone of the repository you want to work
* with, set the URL for the repository in the `repo` option. This usage will
* push all files in the `src` config to the `gh-pages` branch of the `repo`.
*/
ghpages.publish('dist', {
repo: 'https://example.com/other/repo.git'
}, callback);
```
#### <a id="optionsremote">options.remote</a>
* type: `string`
* default: `'origin'`
The name of the remote you'll be pushing to. The default is your `'origin'` remote, but this can be configured to push to any remote.
Example use of the `remote` option:
```js
/**
* This task pushes to the `gh-pages` branch of of your `upstream` remote.
*/
ghpages.publish('dist', {
remote: 'upstream'
}, callback);
```
#### <a id="optionstag">options.tag</a>
* type: `string`
* default: `''`
Create a tag after committing changes on the target branch. By default, no tag is created. To create a tag, provide the tag name as the option value.
#### <a id="optionsmessage">options.message</a>
* type: `string`
* default: `'Updates'`
The commit message for all commits.
Example use of the `message` option:
```js
/**
* This adds commits with a custom message.
*/
ghpages.publish('dist', {
message: 'Auto-generated commit'
}, callback);
```
#### <a id="optionsuser">options.user</a>
* type: `Object`
* default: `null`
If you are running the `gh-pages` task in a repository without a `user.name` or `user.email` git config properties (or on a machine without these global config properties), you must provide user info before git allows you to commit. The `options.user` object accepts `name` and `email` string values to identify the committer.
Example use of the `user` option:
```js
ghpages.publish('dist', {
user: {
name: 'Joe Code',
email: 'coder@example.com'
}
}, callback);
```
#### <a id="optionsuser">options.remove</a>
* type: `string`
* default: `'.'`
Removes files that match the given pattern (Ignored if used together with
`--add`). By default, `gh-pages` removes everything inside the target branch
auto-generated directory before copying the new files from `dir`.
Example use of the `remove` option:
```js
ghpages.publish('dist', {
remove: "*.json"
}, callback);
```
#### <a id="optionspush">options.push</a>
* type: `boolean`
* default: `true`
Push branch to remote. To commit only (with no push) set to `false`.
Example use of the `push` option:
```js
ghpages.publish('dist', {push: false}, callback);
```
#### <a id="optionshistory">options.history</a>
* type: `boolean`
* default: `true`
Push force new commit without parent history.
Example use of the `history` option:
```js
ghpages.publish('dist', {history: false}, callback);
```
#### <a id="optionssilent">options.silent</a>
* type: `boolean`
* default: `false`
Avoid showing repository URLs or other information in errors.
Example use of the `silent` option:
```js
/**
* This configuration will avoid logging the GH_TOKEN if there is an error.
*/
ghpages.publish('dist', {
repo: 'https://' + process.env.GH_TOKEN + '@github.com/user/private-repo.git',
silent: true
}, callback);
```
#### <a id="optionsbeforeadd">options.beforeAdd</a>
* type: `function`
* default: `null`
Custom callback that is executed right before `git add`.
The CLI expects a file exporting the beforeAdd function
```bash
gh-pages --before-add ./cleanup.js
```
Example use of the `beforeAdd` option:
```js
/**
* beforeAdd makes most sense when `add` option is active
* Assuming we want to keep everything on the gh-pages branch
* but remove just `some-outdated-file.txt`
*/
ghpages.publish('dist', {
add: true,
async beforeAdd(git) {
return git.rm('./some-outdated-file.txt');
}
}, callback);
```
#### <a id="optionsgit">options.git</a>
* type: `string`
* default: `'git'`
Your `git` executable.
Example use of the `git` option:
```js
/**
* If `git` is not on your path, provide the path as shown below.
*/
ghpages.publish('dist', {
git: '/path/to/git'
}, callback);
```
## Command Line Utility
Installing the package creates a `gh-pages` command line utility. Run `gh-pages --help` to see a list of supported options.
With a local install of `gh-pages`, you can set up a package script with something like the following:
```shell
"scripts": {
"deploy": "gh-pages -d dist"
}
```
And then to publish everything from your `dist` folder to your `gh-pages` branch, you'd run this:
```shell
npm run deploy
```
## Debugging
To get additional output from the `gh-pages` script, set `NODE_DEBUG=gh-pages`. For example:
```shell
NODE_DEBUG=gh-pages npm run deploy
```
## Dependencies
Note that this plugin requires Git 1.9 or higher (because it uses the `--exit-code` option for `git ls-remote`). If you'd like to see this working with earlier versions of Git, please [open an issue](https://github.com/tschaub/gh-pages/issues).
![Test Status](https://github.com/tschaub/gh-pages/workflows/Test/badge.svg)
## Tips
### when get error `branch already exists`
```
{ ProcessError: fatal: A branch named 'gh-pages' already exists.
at ChildProcess.<anonymous> (~/node_modules/gh-pages/lib/git.js:42:16)
at ChildProcess.emit (events.js:180:13)
at maybeClose (internal/child_process.js:936:16)
at Process.ChildProcess._handle.onexit (internal/child_process.js:220:5)
code: 128,
message: 'fatal: A branch named \'gh-pages\' already exists.\n',
name: 'ProcessError' }
```
The `gh-pages` module writes temporary files to a `node_modules/.cache/gh-pages` directory. The location of this directory can be customized by setting the `CACHE_DIR` environment variable.
If `gh-pages` fails, you may find that you need to manually clean up the cache directory. To remove the cache directory, run `node_modules/gh-pages/bin/gh-pages-clean` or remove `node_modules/.cache/gh-pages`.
### Deploying to github pages with custom domain
Modify the deployment line to your deploy script if you use custom domain. This will prevent the deployment from removing the domain settings in GitHub.
```
echo 'your_cutom_domain.online' > ./build/CNAME && gh-pages -d build"
```
### Deploying with GitHub Actions
In order to deploy with GitHub Actions, you will need to define a user and set the git repository for the process. See the example step below
```yaml
- name: Deploy with gh-pages
run: |
git remote set-url origin https://git:${GITHUB_TOKEN}@github.com/${GITHUB_REPOSITORY}.git
npx gh-pages -d build -u "github-actions-bot <support+actions@github.com>"
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
```
The `secrets.GITHUB_TOKEN` is provided automatically as part of the GitHub Action and does not require any further configuration, but simply needs to be passed in as an environmental variable to the step. `GITHUB_REPOSITORY` is the owner and repository name and is also passed in automatically, but does not need to be added to the `env` list.
See [Issue #345](https://github.com/tschaub/gh-pages/issues/345) for more information
#### Deploying with GitHub Actions and a named script
If you are using a named script in the `package.json` file to deploy, you will need to ensure you pass the variables properly to the wrapped `gh-pages` script. Given the `package.json` script below:
```json
"scripts": {
"deploy": "gh-pages -d build"
}
```
You will need to utilize the `--` option to pass any additional arguments:
```yaml
- name: Deploy with gh-pages
run: |
git remote set-url origin https://git:${GITHUB_TOKEN}@github.com/${GITHUB_REPOSITORY}.git
npm run deploy -- -u "github-actions-bot <support+actions@github.com>"
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
```
See [Pull Request #368](https://github.com/tschaub/gh-pages/pull/368) for more information.