Skip to content

Instantly share code, notes, and snippets.

@tanakahisateru
Created November 17, 2011 09:56
Show Gist options
  • Star 7 You must be signed in to star a gist
  • Fork 3 You must be signed in to fork a gist
  • Save tanakahisateru/1372816 to your computer and use it in GitHub Desktop.
Save tanakahisateru/1372816 to your computer and use it in GitHub Desktop.
Send changed files under Git via SCP (if SSH password auth)
#!/bin/sh
if [ $# -ne 1 ]; then
echo "$0 <git-commit>" 1>&2
exit 1
fi
git diff --name-status $1
read -p "Press any key to execute..."
rm -rf ./tmp
git diff --name-only $1 | git checkout-index --prefix=./tmp/htdocs/ --stdin
git diff --name-status $1 | awk '{if($1=="D") print $2}' > ./tmp/deleted
auto_ssh()
{
expect -c "
spawn $1
expect {
\" Are you sure you want to continue connecting (yes/no)?\" {
send \"yes\r\"
expect \"password:\"
send \"${2}\r\"
}
\"password:\" {
send \"${2}\r\"
}
}
interact
"
}
auto_ssh 'scp -r ./tmp/htdocs username@hostname.com:/home/vhost/www.hostname.com/htdocs' mypassword
for line in `cat ./tmp/deleted`
do
auto_ssh 'ssh username@hostname.com rm -f /home/vhost/www.hostname.com/htdocs/'$line\' mypassword
done
@chernjie
Copy link

Just stumbled upon this. FYI I have done a similar script and have published it at git-extras

Here's how the commands look like

Usage:
    git scp -h|help|?
    git scp <remote> [ref|file..]         # scp and stage your files to specified remote
    git scp <remote> [<ref>]              # show diff relative to <ref> and upload unstaged files to <remote>
    git rscp <remote> [<file|directory>]  # copy <remote> files to current working directory

Example:

# push all modified tracked files, unstaged
$ git scp web

# push all modified tracked files, including files that has been staged
$ git scp web HEAD

# push a single file
$ git scp web .gitignore

# push a directory
$ git scp web node_modules

# push files that are different between rc1.0.0 and current HEAD
$ git scp web rc1.0.0

@gandrewstone
Copy link

for just a couple of files:
scp git ls-files -m user@ip:dir

@noblige
Copy link

noblige commented Sep 26, 2020

one liner preserving directory structure: rsync -R $(git ls-files -m) user@ip:dir

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment