推送更改到远程服务器的问题

时间:2010-10-09 21:49:54

标签: git

我的GIT存储库存在问题。 在远程计算机上:

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

.git / hooks 中,我有推送更新文件:

#!/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 HEAD@{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 HEAD@{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

在所有这些操作之后,我在远程机器上没有任何文件。 当我使用时:

git status

我有:

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

我做错了什么?

当我向file1.txt添加一些teks时,提交更改第二个并将其推送到远程机器然后我看到该文件。

2 个答案:

答案 0 :(得分:1)

远程端不会自动跟踪其工作目录中当前分支的头部。如果在服务器上执行git reset --hard,则应该看到正确的文件。

看起来您的测试文件被删除的原因是因为头部指向您推送的新提交,但实际上并未对工作目录进行更改;只有历史。因此head和当前目录之间的差异包括丢失的文件。因此,Git认为它被删除了。

这是服务器上的存储库裸露的一个原因。没有人应该在服务器本身的存储库中工作,所以没有理由让它有一个工作目录。

答案 1 :(得分:0)

你说“在.git / hooks我有推送 -update文件”,但该文件应该被称为 post -update。