2010-10-09 79 views
3

我有GIT存儲庫的問題。 在遠程機器上:推送更改到遠程服務器的問題

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

的.git /掛鉤我有推送更新文件:

#!/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 

在本地機器上:

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 

畢竟這opertions我在遠程機器上沒有任何文件。 當我使用:

git status 

我:

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

我在做什麼錯?

當我添加一些tek到file1.txt,提交更改第二個,並將其推送到遠程機器,然後我看到該文件。

回答

1

遠端不會自動跟蹤其工作目錄中當前分支的頭部。如果您在服務器上執行git reset --hard,則應該看到正確的文件。

它看起來像你的測試文件被刪除的原因是因爲頭指向你推送的新提交,但這些改變實際上並沒有進入工作目錄;只有歷史。因此,頭部和當前目錄之間的差異包括丟失的文件。因此,Git認爲它已被刪除。

這是爲什麼服務器上的存儲庫是裸露的原因之一。沒有人應該在服務器本身的存儲庫中工作,所以沒有理由要有一個工作目錄。

0

你說「在git的/鉤我有 -update文件」,但該文件應該被稱爲 -update。