Reputation: 6092
How do I set Git to automatically push to a remote repository (including automatically providing my passphrase) after each commit to the local repository?
Upvotes: 105
Views: 72080
Reputation: 1
Create a Git file: commit.sh
#!/bin/sh
cd c:/Users/Lenovo/Desktop/nalms/src
git add --all
timestamp() {
date +"at %H:%M:%S on %d/%m/%Y"
}
git commit -am "Regular auto-commit $(timestamp)"
git push origin master
Open window task scheduler
Create new task
General → name the task
Go to the trigger section and enable the task scheduler
Press the Done button
Upvotes: 0
Reputation: 10701
Here is a Bash script for Git to automatically push
to a remote repository
cd /path/to/your/repository
and then push
Add this script to a file, for example, $HOME/.ssh/push
:
#!/bin/bash
# Check connection
ssh-add -l &>/dev/null
[[ "$?" == 2 ]] && eval `ssh-agent` > /dev/null
# Check if Git config is configured
if [ ! $(git config user.name) ]
then
git config --global user.name <user_name>
git config --global user.email <user_email>
fi
# Check if expect is installed
if [[ ! $(dpkg -l | grep expect) ]]
then
apt-get update > /dev/null
apt-get install --assume-yes --no-install-recommends apt-utils expect > /dev/null
fi
# Check identity
ssh-add -l &>/dev/null
[[ "$?" == 1 ]] && expect $HOME/.ssh/agent > /dev/null
# Clean and push the repository
REMOTE=$(git remote get-url origin)
[email protected]:${REMOTE##*github.com/}
[[ $REMOTE == "http"* ]] && git remote set-url origin $URL
git add . && git commit -m "test automatically push to a remote repo"
git status && git push origin $(git rev-parse --abbrev-ref HEAD) --force
Link it to the /bin
directory, so it can be called by just the push
command:
sudo ln -s $HOME/.ssh/push /bin/push
chmod +x /bin/push
Upvotes: 1
Reputation: 17751
Create a file named "post-commit" in the .git/hooks directory with the contents "git push". Though if you want to automatically provide a password, a modification will be needed.
Upvotes: 14
Reputation: 3
Here are simple instructions for pushing/pulling without providing passphrase over SSH for people using Linux and Windows (Git Bash)
On your client:
Check out if you have SSH keys generated:
$ ls ~/.ssh/id_rsa.pub; ls ~/.ssh/id_dsa.pub
/c/Users/Cermo/.ssh/id_rsa.pub <-- I have RSA key
ls: cannot access '/c/Users/Cermo/.ssh/id_dsa.pub': No such file or directory
If you don't have any key (two "ls: cannot access ..." lines), generate a new one. If you have any of the keys, skip this step.
$ ssh-keygen.exe
Generating public/private rsa key pair.
Enter file in which to save the key (/c/Users/Cermo/.ssh/id_rsa):
Enter passphrase (empty for no passphrase): <-- press Enter
Enter same passphrase again: <-- press Enter
Copy your key to remote server from which you want to pull or push using git:
$ ssh-copy-id user_name@server_name
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to
filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you
are prompted now it is to install the new keys
user_name@server_name's password:
Number of key(s) added: 1
Now try logging into the machine, with: "ssh 'user_name@server_name'"
and check to make sure that only the key(s) you wanted were added.
Note: You will have to provide a password during this operation. After that, your pull/push operations won't request a password.
Note 2: You have to log in to the server using user_name at least once before using this procedure (the home directory, to which SSH keys are copied, is created during the first login).
Upvotes: 0
Reputation: 7315
If you're using Husky, it will overwrite your post-commit
hooks file by default.
We're using this command in package.json to auto-rebase-and-push any commits to master. (First run yarn add --dev git-branch-is
.)
"husky": {
"hooks": {
"post-commit": "git-branch-is master && git rebase origin master && git push origin master"`
}
}
Upvotes: 0
Reputation: 861
If you start using more than the master branch, you might want to automatically push the current branch. My hook (.git/hooks/post-commit
) looks like this:
#!/usr/bin/env bash
branch_name=$(git symbolic-ref --short HEAD)
retcode=$?
non_push_suffix="_local"
# Only push if branch_name was found (my be empty if in detached head state)
if [ $retcode -eq 0 ] ; then
#Only push if branch_name does not end with the non-push suffix
if [[ $branch_name != *$non_push_suffix ]] ; then
echo
echo "**** Pushing current branch $branch_name to origin [i4h post-commit hook]"
echo
git push origin $branch_name;
fi
fi
It pushes the current branch, if it can determine the branch name with git symbolic-ref.
"How to get current branch name in Git?" deals with this and other ways to get the current branch name.
An automatic push for every branch can be disturbing when working in task branches where you expect some sausage making to happen (you won't be able to rebase easily after pushing). So the hook will not push branches that end with a defined suffix (in the example "_local").
Upvotes: 40
Reputation: 467191
First, make sure that you can push manually without providing your password. If you are pushing over HTTP or HTTPS, that will be a case of either creating a .netrc
file with the login details or adding your username and password into the URL for the remote. If you're using SSH, you can either create a keypair where the private key doesn't have a password, or use ssh-agent
to cache your private key.
Then you should create an executable (chmod +x
) file in .git/hooks/post-commit
that contains the following:
#!/bin/sh
git push origin master
... customizing that line if you want to push to a remote other than origin
, or push a branch other than master
. Make sure that you make that file executable.
Upvotes: 170
Reputation: 1324258
This git-autopush script allows you to setup a post-commit hook, similar to what has been recommended in "How configure automatic pushing?".
But for the passphrase, you need to run a ssh-agent
.
Upvotes: 3