tj.git-extras/man/git-scp.md
AJ Côté 5a14757944
feat(scp): add verbose, interactive, and dry-run flags (#1261)
* feat(scp): add -v/--verbose and -i/--interactive flags

git scp/git rscp printed a diff via plain `git diff`/`git diff --stat`
with no `--no-pager` and no TTY check, blocking on the user's pager.
Add -v/--verbose to print the diff via --no-pager before syncing, and
-i/--interactive to also prompt for confirmation before the real
push/copy. Both apply to git scp and git rscp, and must precede
<remote>.

Updates man/git-scp.md and Commands.md.

* feat(scp): add -n/--dry-run flag

Add -n/--dry-run to preview a sync without changing anything: rsync
runs with -n, and git add --force / ssh ... rm are skipped outright.
Implies --verbose, since confirming or previewing with nothing shown
is useless.

Also restructures scp_and_stage's push/delete blocks from `&&`-chains
into if/then, needed to branch on dry-run, which incidentally fixes a
latent bug where a non-TTY COLOR_RESET could silently skip the real
rsync/git add/ssh rm calls.

Updates man/git-scp.md and Commands.md.

* test(scp): add coverage for -n/--dry-run and -i/--interactive abort

git-scp had no test coverage at all. Cover the two paths that need no
real remote destination: dry-run must preview without touching the
index, working tree, or remote path, and declining the interactive
confirmation must abort before anything syncs.

* feat(scp): Code review

* feat(scp): Code review
2026-07-14 19:43:00 +08:00

2.7 KiB

git-scp(1) -- Copy files to SSH compatible git-remote

SYNOPSIS

`git scp` -h|help|?
`git scp` [options] <remote> [<commits>...|<path>...]
`git rscp` [options] <remote> <path>

DESCRIPTION

A convenient way to copy files from the current working tree to the working directory of a remote repository. If a <commits>... is provided, only files that has changed within the commit range will be copied.

Internally this script uses rsync and not scp as the name suggests.

git-rscp - The reverse of git-scp. Copies specific files from the working directory of a remote repository to the current working directory.

OPTIONS

<remote>

The git remote where you want to copy your files.

<commits>...

Any commit, commit range or tree. Uses `git-diff`(1)

<path>...

The <paths> parameters, when given, are used to limit the diff to the named paths (you can give directory names and get diff for all files under them).

-v, --verbose

Print what will be synced before syncing: the diff for `git scp`, or a preview (rsync dry-run) for `git rscp`.

-i, --interactive

Same as `--verbose`, but also prompt for confirmation before syncing. Implies `--verbose`

-n, --dry-run

Show what would be synced, change nothing. Implies `--verbose`, and no staging or remote writes/deletes happen.

GIT CONFIGS

To sanitize files using dos2unix before copying files

$ git config --global --add extras.scp.sanitize dos2unix

You can run the files through PHP lint (i.e. php -l) before copying files

$ git config --global --add extras.scp.sanitize php_lint

EXAMPLES

Make sure you have git-remote(1) setup

$ git remote add staging myStagingServer:/var/www/html

Copy unstaged files to remote. Useful when you want to make quick test without making any commits

$ git scp staging

Copy staged and unstaged files to remote

$ git scp staging HEAD

Copy files that has been changed in the last commit, plus any staged or unstaged files to remote

$ git scp staging HEAD~1

Copy files that has been changed between now and a tag

$ git scp staging v1.2.3

Copy specific files

$ git scp staging index.html .gitignore .htaccess

Copy specific directory

$ git scp staging js/vendor/

Copy files from specific directory to multiple servers

$ for dest in web1 web2 web3; do
    git diff --name-only 4.8.3 4.8.2 app/code/community app/design skin/ | xargs git scp $dest
done;

AUTHOR

Written by Chern Jie <lim@chernjie.com>

REPORTING BUGS

<https://github.com/chernjie/git-extras/issues>

SEE ALSO

<https://github.com/tj/git-extras>