2010-10-09 6 views
3

J'ai un problème avec le référentiel GIT. Sur la machine distante:Problème avec les modifications push sur le serveur distant

git init test.git && cd test.git 
git config core.bare false 
git config receive.denycurrentbranch ignore 

Dans .git/crochets je file push-update:

#!/bin/sh 
# 
# This hook does two things: 
# 
# 1. update the "info" files that allow the list of references to be 
#  queries over dumb transports such as http 
# 
# 2. if this repository looks like it is a non-bare repository, and 
#  the checked-out branch is pushed to, then update the working copy. 
#  This makes "push" function somewhat similarly to darcs and bzr. 
# 
# To enable this hook, make this file executable by "chmod +x post-update". 

#git update-server-info 

is_bare=$(git config --get --bool core.bare) 

if [ -z "$is_bare" ] 
then 
# for compatibility's sake, guess 
git_dir_full=$(cd $GIT_DIR; pwd) 
case $git_dir_full in */.git) is_bare=false;; *) is_bare=true;; esac 
fi 

update_wc() { 
ref=$1 
echo "Push to checked out branch $ref" >&2 
if [ ! -f $GIT_DIR/logs/HEAD ] 
then 
    echo "E:push to non-bare repository requires a HEAD reflog" >&2 
    exit 1 
fi 
if (cd $GIT_WORK_TREE; git-diff-files -q --exit-code >/dev/null) 
then 
    wc_dirty=0 
else 
    echo "W:unstaged changes found in working copy" >&2 
    wc_dirty=1 
    desc="working copy" 
fi 
if git diff-index --cached [email protected]{1} >/dev/null 
then 
    index_dirty=0 
else 
    echo "W:uncommitted, staged changes found" >&2 
    index_dirty=1 
    if [ -n "$desc" ] 
    then 
    desc="$desc and index" 
    else 
    desc="index" 
    fi 
fi 
if [ "$wc_dirty" -ne 0 -o "$index_dirty" -ne 0 ] 
then 
    new=$(git rev-parse HEAD) 
    echo "W:stashing dirty $desc - see git-stash(1)" >&2 
    (trap 'echo trapped $$; git symbolic-ref HEAD "'"$ref"'"' 2 3 13 15 ERR EXIT 
    git-update-ref --no-deref HEAD [email protected]{1} 
    cd $GIT_WORK_TREE 
    git stash save "dirty $desc before update to $new"; 
    git-symbolic-ref HEAD "$ref" 
) 
fi 

# eye candy - show the WC updates :) 
echo "Updating working copy" >&2 
(cd $GIT_WORK_TREE 
git-diff-index -R --name-status HEAD >&2 
git-reset --hard HEAD) 
} 

if [ "$is_bare" = "false" ] 
then 
active_branch=`git symbolic-ref HEAD` 
export GIT_DIR=$(cd $GIT_DIR; pwd) 
GIT_WORK_TREE=${GIT_WORK_TREE-..} 
for ref 
do 
    if [ "$ref" = "$active_branch" ] 
    then 
    update_wc $ref 
    fi 
done 
fi 

sur la machine locale:

git init test.git 
touch file1.txt 
git add . 
git commit -m "Initial commit" 
git remote add origin ssh://<REMOTE_REPO_ADDRESS> 
git push origin master 

Après tout ce que je opertions ne possède aucun fichier sur la machine distante. Quand j'utilise:

git status 

Je:

# On branch master 
# Changes to be committed: 
# (use "git reset HEAD <file>..." to unstage) 
# 
#  deleted: file1.txt 
# 

Qu'est-ce que je fais mal?

Lorsque j'ajoute des éléments au fichier file1.txt, le commit change le second et le pousse sur la machine distante puis je vois le fichier.

Répondre

1

L'extrémité distante ne suit pas automatiquement la tête de sa branche actuelle dans son répertoire de travail. Si vous faites un git reset --hard sur le serveur, vous devriez voir les bons fichiers.

La raison pour laquelle votre fichier de test semble avoir été supprimé est que la tête pointe sur le nouveau commit que vous avez envoyé, mais les modifications n'ont pas été apportées au répertoire de travail; seulement à l'histoire. Ainsi, les différences entre head et le répertoire courant incluent un fichier manquant. Ainsi, Git suppose qu'il a été supprimé.

C'est l'une des raisons pour lesquelles les dépôts sur les serveurs sont vides. Personne ne devrait travailler dans ce dépôt sur le serveur lui-même, donc il n'y a aucune raison pour qu'il ait un répertoire de travail.

0

Vous dites « En .git/crochets je pousser fichier -update », mais le fichier doit être appelé après -update.

Questions connexes