mirror of
https://github.com/tj/git-extras.git
synced 2026-09-12 16:36:22 -04:00
Merge pull request #300 from chernjie/git-scp
git scp - Copy files to SSH compatible `git-remote`.
This commit is contained in:
commit
83b9348c91
1
bin/git-rscp
Symbolic link
1
bin/git-rscp
Symbolic link
|
|
@ -0,0 +1 @@
|
|||
git-scp
|
||||
178
bin/git-scp
Executable file
178
bin/git-scp
Executable file
|
|
@ -0,0 +1,178 @@
|
|||
#!/usr/bin/env bash
|
||||
|
||||
COLOR_RED() { echo -en "\033[31m"; }
|
||||
COLOR_GREEN() { echo -en "\033[32m"; }
|
||||
COLOR_YELLOW(){ echo -en "\033[33m"; }
|
||||
COLOR_BLUE() { echo -en "\033[34m"; }
|
||||
COLOR_RESET() { echo -en "\033[0m"; }
|
||||
|
||||
function _test_git_scp()
|
||||
{
|
||||
command -v rsync > /dev/null || _error requires rsync
|
||||
command -v git > /dev/null || _error requires git
|
||||
command -v ssh > /dev/null || _error requires ssh
|
||||
command -v php > /dev/null || _info optional php
|
||||
command -v dos2unix > /dev/null || _info optional dos2unix
|
||||
}
|
||||
|
||||
function set_remote()
|
||||
{
|
||||
remote=$1
|
||||
if [ $(git remote | grep -c ^$remote$) -eq 0 ]
|
||||
then
|
||||
COLOR_RED
|
||||
echo "Remote $remote does not exist in your git config"
|
||||
COLOR_RESET
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
# Check file for PHP syntax errors
|
||||
# takes a list of filenames
|
||||
function php_lint()
|
||||
{
|
||||
local error_count=()
|
||||
for i
|
||||
do
|
||||
# check if file exists
|
||||
# check if file ends with ".php"
|
||||
test ! -f "$i" && continue
|
||||
case "$i" in
|
||||
*\.php|*\.phtml)
|
||||
php -l "$i" > /dev/null
|
||||
[ $? -gt 0 ] && error_count[${#error_count[@]}]="$i"
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
# syntax check fails, force exit
|
||||
test ${#error_count[@]} -gt 0 &&
|
||||
COLOR_RED &&
|
||||
echo "Error: ${#error_count[@]} PHP syntax error found" &&
|
||||
echo "${error_count[@]}" | tr " " '\n' &&
|
||||
COLOR_RESET &&
|
||||
exit 255
|
||||
|
||||
return 0
|
||||
}
|
||||
|
||||
function _dos2unix()
|
||||
{
|
||||
command -v dos2unix > /dev/null && dos2unix $@
|
||||
return 0
|
||||
}
|
||||
|
||||
function _sanitize()
|
||||
{
|
||||
git config --get-all extras.scp.sanitize | while read i
|
||||
do
|
||||
case $i in
|
||||
php_lint) php_lint $@;; # git config --global --add extras.scp.sanitize php_lint
|
||||
dos2unix) _dos2unix $@;; # git config --global --add extras.scp.sanitize dos2unix
|
||||
esac
|
||||
done
|
||||
return $?
|
||||
}
|
||||
|
||||
function scp_and_stage
|
||||
{
|
||||
set_remote $1
|
||||
shift
|
||||
|
||||
local refhead="$(git rev-parse --quiet --verify $1)"
|
||||
if [ -n "$refhead" ]
|
||||
then
|
||||
shift
|
||||
[ $(git branch --contains "$refhead" | grep -c '\*') -eq 0 ] &&
|
||||
_error "refhead provided is not part of current branch"
|
||||
fi
|
||||
|
||||
if [ $# -ge 1 ]
|
||||
then
|
||||
list=$(git ls-files "$@")" "$(git ls-files -o "$@")
|
||||
elif [ -n "$refhead" ]
|
||||
then
|
||||
git diff --stat $refhead
|
||||
list=$(git diff $refhead --name-only)
|
||||
else
|
||||
git diff
|
||||
list=$(git diff --name-only)
|
||||
fi
|
||||
|
||||
deleted=$(for i in $list; do [ -f $i ] || echo $i; done)
|
||||
list=$(for i in $list; do [ -f $i ] && echo $i; done)
|
||||
|
||||
if [ -n "$list" ]
|
||||
then
|
||||
local _TMP=${0///}
|
||||
echo "$list" > $_TMP &&
|
||||
_sanitize $list &&
|
||||
_info Pushing to $remote \($(git config remote.$remote.url)\) &&
|
||||
rsync -rlDv --files-from=$_TMP ./ "$(git config remote.$remote.url)/" &&
|
||||
git add $list &&
|
||||
rm $_TMP
|
||||
fi
|
||||
|
||||
deleted=$(for i in $deleted; do echo $(git config remote.$remote.url | cut -d: -f2)/$i; done)
|
||||
|
||||
[ -n "$deleted" ] &&
|
||||
COLOR_RED &&
|
||||
echo Deleted remote files &&
|
||||
ssh $(git config remote.$remote.url | cut -d: -f1) -t "rm $deleted" &&
|
||||
echo "$deleted"
|
||||
COLOR_RESET
|
||||
}
|
||||
|
||||
function reverse_scp()
|
||||
{
|
||||
set_remote $1
|
||||
shift
|
||||
|
||||
local _TMP=${0///}
|
||||
echo $@ > $_TMP &&
|
||||
rsync -rlDv --files-from=$_TMP "$(git config remote.$remote.url)/" ./ &&
|
||||
rm $_TMP
|
||||
}
|
||||
|
||||
function _info()
|
||||
{
|
||||
COLOR_YELLOW
|
||||
test $# -gt 0 && echo "$@"
|
||||
COLOR_RESET
|
||||
}
|
||||
|
||||
function _usage()
|
||||
{
|
||||
echo "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
|
||||
"
|
||||
|
||||
case $1 in
|
||||
-v|verbose|--verbose) grep -A100 '^#* OPTIONS #*$' $0;;
|
||||
esac
|
||||
exit
|
||||
}
|
||||
|
||||
function _error()
|
||||
{
|
||||
[ $# -eq 0 ] && _usage && exit 0
|
||||
|
||||
echo
|
||||
echo ERROR: "$@"
|
||||
echo
|
||||
exit 1
|
||||
}
|
||||
|
||||
### OPTIONS ###
|
||||
case $(basename $0) in
|
||||
git-scp)
|
||||
case $1 in
|
||||
''|-h|?|help|--help) shift; _test_git_scp; _usage $@;;
|
||||
*) scp_and_stage $@;;
|
||||
esac
|
||||
;;
|
||||
git-rscp) reverse_scp $@;;
|
||||
esac
|
||||
|
|
@ -86,6 +86,14 @@ _git_refactor(){
|
|||
__git_extras_workflow "refactor"
|
||||
}
|
||||
|
||||
_git_scp(){
|
||||
__git_complete_remote_or_refspec
|
||||
}
|
||||
|
||||
_git_rscp(){
|
||||
__git_complete_remote_or_refspec
|
||||
}
|
||||
|
||||
_git_squash(){
|
||||
__gitcomp "$(__git_heads)"
|
||||
}
|
||||
|
|
|
|||
206
man/git-scp.1
Normal file
206
man/git-scp.1
Normal file
|
|
@ -0,0 +1,206 @@
|
|||
.\" generated with Ronn/v0.7.3
|
||||
.\" http://github.com/rtomayko/ronn/tree/0.7.3
|
||||
.
|
||||
.TH "GIT\-SCP" "1" "December 2014" "" "Git Extras"
|
||||
.
|
||||
.SH "NAME"
|
||||
\fBgit\-scp\fR \- Copy files to SSH compatible \fBgit\-remote\fR
|
||||
.
|
||||
.SH "SYNOPSIS"
|
||||
.
|
||||
.nf
|
||||
|
||||
`git scp` \-h|help|?
|
||||
`git scp` <remote> [<commits>\.\.\.|<path>\.\.\.]
|
||||
`git rscp` <remote> <path>
|
||||
.
|
||||
.fi
|
||||
.
|
||||
.SH "DESCRIPTION"
|
||||
A convenient way to copy files from the current working tree to the working directory of a remote repository\. If a \fB<commits>\.\.\.\fR is provided, only files that has changed within the commit range will be copied\.
|
||||
.
|
||||
.P
|
||||
Internally this script uses \fBrsync\fR and not \fBscp\fR as the name suggests\.
|
||||
.
|
||||
.P
|
||||
\fBgit\-rscp\fR \- The reverse of \fBgit\-scp\fR\. Copies specific files from the working directory of a remote repository to the current working directory\.
|
||||
.
|
||||
.SH "OPTIONS"
|
||||
<remote>
|
||||
.
|
||||
.IP "" 4
|
||||
.
|
||||
.nf
|
||||
|
||||
The git remote where you want to copy your files\.
|
||||
.
|
||||
.fi
|
||||
.
|
||||
.IP "" 0
|
||||
.
|
||||
.P
|
||||
<commits>\.\.\.
|
||||
.
|
||||
.IP "" 4
|
||||
.
|
||||
.nf
|
||||
|
||||
Any commit, commit range or tree\. Uses `git\-diff`(1)
|
||||
.
|
||||
.fi
|
||||
.
|
||||
.IP "" 0
|
||||
.
|
||||
.P
|
||||
<path>\.\.\.
|
||||
.
|
||||
.IP "" 4
|
||||
.
|
||||
.nf
|
||||
|
||||
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)\.
|
||||
.
|
||||
.fi
|
||||
.
|
||||
.IP "" 0
|
||||
.
|
||||
.SH "GIT CONFIGS"
|
||||
To sanitize files using \fBdos2unix\fR before copying files
|
||||
.
|
||||
.IP "" 4
|
||||
.
|
||||
.nf
|
||||
|
||||
$ git config \-\-global \-\-add extras\.scp\.sanitize dos2unix
|
||||
.
|
||||
.fi
|
||||
.
|
||||
.IP "" 0
|
||||
.
|
||||
.P
|
||||
You can run the files through PHP lint (i\.e\. \fBphp \-l\fR) before copying files
|
||||
.
|
||||
.IP "" 4
|
||||
.
|
||||
.nf
|
||||
|
||||
$ git config \-\-global \-\-add extras\.scp\.sanitize php_lint
|
||||
.
|
||||
.fi
|
||||
.
|
||||
.IP "" 0
|
||||
.
|
||||
.SH "EXAMPLES"
|
||||
Make sure you have \fBgit\-remote\fR(1) setup
|
||||
.
|
||||
.IP "" 4
|
||||
.
|
||||
.nf
|
||||
|
||||
$ git remote add staging myStagingServer:/var/www/html
|
||||
.
|
||||
.fi
|
||||
.
|
||||
.IP "" 0
|
||||
.
|
||||
.P
|
||||
Copy unstaged files to remote\. Useful when you want to make quick test without making any commits
|
||||
.
|
||||
.IP "" 4
|
||||
.
|
||||
.nf
|
||||
|
||||
$ git scp staging
|
||||
.
|
||||
.fi
|
||||
.
|
||||
.IP "" 0
|
||||
.
|
||||
.P
|
||||
Copy staged and unstaged files to remote
|
||||
.
|
||||
.IP "" 4
|
||||
.
|
||||
.nf
|
||||
|
||||
$ git scp staging HEAD
|
||||
.
|
||||
.fi
|
||||
.
|
||||
.IP "" 0
|
||||
.
|
||||
.P
|
||||
Copy files that has been changed in the last commit, plus any staged or unstaged files to remote
|
||||
.
|
||||
.IP "" 4
|
||||
.
|
||||
.nf
|
||||
|
||||
$ git scp staging HEAD~1
|
||||
.
|
||||
.fi
|
||||
.
|
||||
.IP "" 0
|
||||
.
|
||||
.P
|
||||
Copy files that has been changed between now and a tag
|
||||
.
|
||||
.IP "" 4
|
||||
.
|
||||
.nf
|
||||
|
||||
$ git scp staging v1\.2\.3
|
||||
.
|
||||
.fi
|
||||
.
|
||||
.IP "" 0
|
||||
.
|
||||
.P
|
||||
Copy specific files
|
||||
.
|
||||
.IP "" 4
|
||||
.
|
||||
.nf
|
||||
|
||||
$ git scp staging index\.html \.gitignore \.htaccess
|
||||
.
|
||||
.fi
|
||||
.
|
||||
.IP "" 0
|
||||
.
|
||||
.P
|
||||
Copy specific directory
|
||||
.
|
||||
.IP "" 4
|
||||
.
|
||||
.nf
|
||||
|
||||
$ git scp staging js/vendor/
|
||||
.
|
||||
.fi
|
||||
.
|
||||
.IP "" 0
|
||||
.
|
||||
.P
|
||||
Copy files from specific directory to multiple servers
|
||||
.
|
||||
.IP "" 4
|
||||
.
|
||||
.nf
|
||||
|
||||
$ 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;
|
||||
.
|
||||
.fi
|
||||
.
|
||||
.IP "" 0
|
||||
.
|
||||
.SH "AUTHOR"
|
||||
Written by Chern Jie <\fIlim@chernjie\.com\fR>
|
||||
.
|
||||
.SH "REPORTING BUGS"
|
||||
<\fIhttps://github\.com/chernjie/git\-extras/issues\fR>
|
||||
.
|
||||
.SH "SEE ALSO"
|
||||
<\fIhttps://github\.com/tj/git\-extras\fR>
|
||||
187
man/git-scp.html
Normal file
187
man/git-scp.html
Normal file
|
|
@ -0,0 +1,187 @@
|
|||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv='content-type' value='text/html;charset=utf8'>
|
||||
<meta name='generator' value='Ronn/v0.7.3 (http://github.com/rtomayko/ronn/tree/0.7.3)'>
|
||||
<title>git-scp(1) - Copy files to SSH compatible <code>git-remote</code></title>
|
||||
<style type='text/css' media='all'>
|
||||
/* style: man */
|
||||
body#manpage {margin:0}
|
||||
.mp {max-width:100ex;padding:0 9ex 1ex 4ex}
|
||||
.mp p,.mp pre,.mp ul,.mp ol,.mp dl {margin:0 0 20px 0}
|
||||
.mp h2 {margin:10px 0 0 0}
|
||||
.mp > p,.mp > pre,.mp > ul,.mp > ol,.mp > dl {margin-left:8ex}
|
||||
.mp h3 {margin:0 0 0 4ex}
|
||||
.mp dt {margin:0;clear:left}
|
||||
.mp dt.flush {float:left;width:8ex}
|
||||
.mp dd {margin:0 0 0 9ex}
|
||||
.mp h1,.mp h2,.mp h3,.mp h4 {clear:left}
|
||||
.mp pre {margin-bottom:20px}
|
||||
.mp pre+h2,.mp pre+h3 {margin-top:22px}
|
||||
.mp h2+pre,.mp h3+pre {margin-top:5px}
|
||||
.mp img {display:block;margin:auto}
|
||||
.mp h1.man-title {display:none}
|
||||
.mp,.mp code,.mp pre,.mp tt,.mp kbd,.mp samp,.mp h3,.mp h4 {font-family:monospace;font-size:14px;line-height:1.42857142857143}
|
||||
.mp h2 {font-size:16px;line-height:1.25}
|
||||
.mp h1 {font-size:20px;line-height:2}
|
||||
.mp {text-align:justify;background:#fff}
|
||||
.mp,.mp code,.mp pre,.mp pre code,.mp tt,.mp kbd,.mp samp {color:#131211}
|
||||
.mp h1,.mp h2,.mp h3,.mp h4 {color:#030201}
|
||||
.mp u {text-decoration:underline}
|
||||
.mp code,.mp strong,.mp b {font-weight:bold;color:#131211}
|
||||
.mp em,.mp var {font-style:italic;color:#232221;text-decoration:none}
|
||||
.mp a,.mp a:link,.mp a:hover,.mp a code,.mp a pre,.mp a tt,.mp a kbd,.mp a samp {color:#0000ff}
|
||||
.mp b.man-ref {font-weight:normal;color:#434241}
|
||||
.mp pre {padding:0 4ex}
|
||||
.mp pre code {font-weight:normal;color:#434241}
|
||||
.mp h2+pre,h3+pre {padding-left:0}
|
||||
ol.man-decor,ol.man-decor li {margin:3px 0 10px 0;padding:0;float:left;width:33%;list-style-type:none;text-transform:uppercase;color:#999;letter-spacing:1px}
|
||||
ol.man-decor {width:100%}
|
||||
ol.man-decor li.tl {text-align:left}
|
||||
ol.man-decor li.tc {text-align:center;letter-spacing:4px}
|
||||
ol.man-decor li.tr {text-align:right;float:right}
|
||||
</style>
|
||||
</head>
|
||||
<!--
|
||||
The following styles are deprecated and will be removed at some point:
|
||||
div#man, div#man ol.man, div#man ol.head, div#man ol.man.
|
||||
|
||||
The .man-page, .man-decor, .man-head, .man-foot, .man-title, and
|
||||
.man-navigation should be used instead.
|
||||
-->
|
||||
<body id='manpage'>
|
||||
<div class='mp' id='man'>
|
||||
|
||||
<div class='man-navigation' style='display:none'>
|
||||
<a href="#NAME">NAME</a>
|
||||
<a href="#SYNOPSIS">SYNOPSIS</a>
|
||||
<a href="#DESCRIPTION">DESCRIPTION</a>
|
||||
<a href="#OPTIONS">OPTIONS</a>
|
||||
<a href="#GIT-CONFIGS">GIT CONFIGS</a>
|
||||
<a href="#EXAMPLES">EXAMPLES</a>
|
||||
<a href="#AUTHOR">AUTHOR</a>
|
||||
<a href="#REPORTING-BUGS">REPORTING BUGS</a>
|
||||
<a href="#SEE-ALSO">SEE ALSO</a>
|
||||
</div>
|
||||
|
||||
<ol class='man-decor man-head man head'>
|
||||
<li class='tl'>git-scp(1)</li>
|
||||
<li class='tc'>Git Extras</li>
|
||||
<li class='tr'>git-scp(1)</li>
|
||||
</ol>
|
||||
|
||||
<h2 id="NAME">NAME</h2>
|
||||
<p class="man-name">
|
||||
<code>git-scp</code> - <span class="man-whatis">Copy files to SSH compatible <code>git-remote</code></span>
|
||||
</p>
|
||||
|
||||
<h2 id="SYNOPSIS">SYNOPSIS</h2>
|
||||
|
||||
<pre><code>`git scp` -h|help|?
|
||||
`git scp` <remote> [<commits>...|<path>...]
|
||||
`git rscp` <remote> <path>
|
||||
</code></pre>
|
||||
|
||||
<h2 id="DESCRIPTION">DESCRIPTION</h2>
|
||||
|
||||
<p>A convenient way to copy files from the current working tree to the working directory of a remote repository. If a <code><commits>...</code> is provided, only files that has changed within the commit range will be copied.</p>
|
||||
|
||||
<p>Internally this script uses <code>rsync</code> and not <code>scp</code> as the name suggests.</p>
|
||||
|
||||
<p><code>git-rscp</code> - The reverse of <code>git-scp</code>. Copies specific files from the working directory of a remote repository to the current working directory.</p>
|
||||
|
||||
<h2 id="OPTIONS">OPTIONS</h2>
|
||||
|
||||
<p> <remote></p>
|
||||
|
||||
<pre><code>The git remote where you want to copy your files.
|
||||
</code></pre>
|
||||
|
||||
<p> <commits>...</p>
|
||||
|
||||
<pre><code>Any commit, commit range or tree. Uses `git-diff`(1)
|
||||
</code></pre>
|
||||
|
||||
<p> <path>...</p>
|
||||
|
||||
<pre><code>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).
|
||||
</code></pre>
|
||||
|
||||
<h2 id="GIT-CONFIGS">GIT CONFIGS</h2>
|
||||
|
||||
<p> To sanitize files using <code>dos2unix</code> before copying files</p>
|
||||
|
||||
<pre><code>$ git config --global --add extras.scp.sanitize dos2unix
|
||||
</code></pre>
|
||||
|
||||
<p> You can run the files through PHP lint (i.e. <code>php -l</code>) before copying files</p>
|
||||
|
||||
<pre><code>$ git config --global --add extras.scp.sanitize php_lint
|
||||
</code></pre>
|
||||
|
||||
<h2 id="EXAMPLES">EXAMPLES</h2>
|
||||
|
||||
<p> Make sure you have <code>git-remote</code>(1) setup</p>
|
||||
|
||||
<pre><code>$ git remote add staging myStagingServer:/var/www/html
|
||||
</code></pre>
|
||||
|
||||
<p> Copy unstaged files to remote. Useful when you want to make quick test without making any commits</p>
|
||||
|
||||
<pre><code>$ git scp staging
|
||||
</code></pre>
|
||||
|
||||
<p> Copy staged and unstaged files to remote</p>
|
||||
|
||||
<pre><code>$ git scp staging HEAD
|
||||
</code></pre>
|
||||
|
||||
<p> Copy files that has been changed in the last commit, plus any staged or unstaged files to remote</p>
|
||||
|
||||
<pre><code>$ git scp staging HEAD~1
|
||||
</code></pre>
|
||||
|
||||
<p> Copy files that has been changed between now and a tag</p>
|
||||
|
||||
<pre><code>$ git scp staging v1.2.3
|
||||
</code></pre>
|
||||
|
||||
<p> Copy specific files</p>
|
||||
|
||||
<pre><code>$ git scp staging index.html .gitignore .htaccess
|
||||
</code></pre>
|
||||
|
||||
<p> Copy specific directory</p>
|
||||
|
||||
<pre><code>$ git scp staging js/vendor/
|
||||
</code></pre>
|
||||
|
||||
<p> Copy files from specific directory to multiple servers</p>
|
||||
|
||||
<pre><code>$ 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;
|
||||
</code></pre>
|
||||
|
||||
<h2 id="AUTHOR">AUTHOR</h2>
|
||||
|
||||
<p>Written by Chern Jie <<a href="mailto:lim@chernjie.com" data-bare-link="true">lim@chernjie.com</a>></p>
|
||||
|
||||
<h2 id="REPORTING-BUGS">REPORTING BUGS</h2>
|
||||
|
||||
<p><<a href="https://github.com/chernjie/git-extras/issues" data-bare-link="true">https://github.com/chernjie/git-extras/issues</a>></p>
|
||||
|
||||
<h2 id="SEE-ALSO">SEE ALSO</h2>
|
||||
|
||||
<p><<a href="https://github.com/tj/git-extras" data-bare-link="true">https://github.com/tj/git-extras</a>></p>
|
||||
|
||||
|
||||
<ol class='man-decor man-foot man foot'>
|
||||
<li class='tl'></li>
|
||||
<li class='tc'>December 2014</li>
|
||||
<li class='tr'>git-scp(1)</li>
|
||||
</ol>
|
||||
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
88
man/git-scp.md
Normal file
88
man/git-scp.md
Normal file
|
|
@ -0,0 +1,88 @@
|
|||
git-scp(1) -- Copy files to SSH compatible `git-remote`
|
||||
=======================================================
|
||||
|
||||
## SYNOPSIS
|
||||
|
||||
`git scp` -h|help|?
|
||||
`git scp` <remote> [<commits>...|<path>...]
|
||||
`git rscp` <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).
|
||||
|
||||
## 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>>
|
||||
Loading…
Reference in a new issue