Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Git push to checkout?

Tags:

git

I want to push my files directly to my web server. I added the server as testingand tried

git push testing

but I get this error. The solution to make a bare repository works but I want the files to be checked out automaticly. I found this script but that did not change anything.

I can transfer changes over a third bare repository but that just takes to long:

client:
git commit -m "test" -a
git push origin
<password>

server:
git pull origin/master

Update (2)

I created on the server a new branch git branch testing.

Also on the server I created .git/hooks/post-update an added:

echo "a" >> /home/pi/log
git update-server-info
git stash
git merge testing >> /home/pi/log

On the client I run

git push testing HEAD:testing

Now my /home/pi/log contains:

a
Updating ae2f44b..04753a9
Fast-forward
 application/views/main/index.php |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)

But the file did not change. What could still be wrong?

like image 573
PiTheNumber Avatar asked Feb 10 '12 11:02

PiTheNumber


People also ask

How do I push to a branch?

To push the branch or you can say to push the changes in the branch to the Github repo you have to run this command “git push origin <the branch name>” in our case the branch name is “main”. After pushing the changes the repo will look like and this is how you can push a branch to a remotely hosted GitHub repository.

How do you checkout in git?

Git checkout works hand-in-hand with git branch . The git branch command can be used to create a new branch. When you want to start a new feature, you create a new branch off main using git branch new_branch . Once created you can then use git checkout new_branch to switch to that branch.

How do I force git to checkout a file?

Force a Checkout You can pass the -f or --force option with the git checkout command to force Git to switch branches, even if you have un-staged changes (in other words, the index of the working tree differs from HEAD ). Basically, it can be used to throw away local changes.

How do I push to a git repository?

Perform a git init command in the root folder of the existing project. Add all of the existing project's files to the Git index and then commit. Add the GitHub repo as a remote reference for the existing project. Perform a git push operation with the -u and -f switches.


2 Answers

You now how "push-to-deploy" (git 2.4, May 2015), which improves on "push-to-checkout" (Git 2.3, February 2015).

See "Deploy a project using Git push" for a concrete example.

In short, you can push directly to a checked out branch (with caveats).
See commit 4d7a5ce


Update: With Git 2.30 (Q1 2021), you now have a sample 'push-to-checkout' hook, that performs the same as what the built-in default action does.

See commit e632c46 (15 Oct 2020) by Adam Spiers (aspiers).
(Merged by Junio C Hamano -- gitster -- in commit df7f850, 02 Nov 2020)

hook: add sample template for push-to-checkout

Signed-off-by: Adam Spiers

The template is a more-or-less exact translation to shell of the C code for the default behaviour for git's push-to-checkout hook defined in the push_to_deploy() function in builtin/receive-pack.c, to serve as a convenient starting point for modification.

It also contains relevant text extracted from the git-config(1) and githooks(5) man pages.

That is:

An example hook script to update a checked-out tree on a git push.

This hook is invoked by git-receive-pack when it reacts to git push and updates reference(s) in its repository, and when the push tries to update the branch that is currently checked out and the receive.denyCurrentBranch configuration variable is set to updateInstead.

By default, such a push is refused if the working tree and the index of the remote repository has any difference from the currently checked out commit; when both the working tree and the index match the current commit, they are updated to match the newly pushed tip of the branch.

This hook is to be used to override the default behaviour; however the code below reimplements the default behaviour as a starting point for convenient modification.

The hook receives the commit with which the tip of the current branch is going to be updated:

commit=$1

It can exit with a non-zero status to refuse the push (when it does so, it must not modify the index or the working tree).

die () {
   echo >&2 "$*"
   exit 1
}

Or it can make any necessary changes to the working tree and to the index to bring them to the desired state when the tip of the current branch is updated to the new commit, and exit with a zero status.

For example, the hook can simply run git read-tree -u -m HEAD "$1" in order to emulate git fetch that is run in the reverse direction with git push, as the two-tree form of git read-tree -u -m is essentially the same as git switch or git checkout that switches branches while keeping the local changes in the working tree that do not interfere with the difference between the branches.

The below is a more-or-less exact translation to shell of the C code for the default behaviour for git's push-to-checkout hook defined in the push_to_deploy() function in builtin/receive-pack.c.

Note that the hook will be executed from the repository directory, not from the working tree, so if you want to perform operations on the working tree, you will have to adapt your code accordingly, e.g. by adding "cd .." or using relative paths.

like image 125
VonC Avatar answered Oct 16 '22 15:10

VonC


You cannot push to a branch that is checked out, because the branch pointer is used to track the working directory state.

Instead, push to a different branch, then, from the push hook script, merge that branch into your working directory; this merge is then executed as a fast-forward as long as there were no local changes.

like image 32
Simon Richter Avatar answered Oct 16 '22 16:10

Simon Richter