проблема с принудительными изменениями на удаленном сервере - PullRequest
3 голосов
/ 10 октября 2010

У меня проблема с GIT-репозиторием.На удаленной машине:

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

В .git / hooks У меня есть файл push-обновления:

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

Что я делаю не так?

Когда я добавляю некоторые teks в file1.txt, вносим изменениявторой и нажмите его на удаленной машине, затем я вижу файл.

Ответы [ 2 ]

1 голос
/ 12 октября 2010

Удаленный конец не отслеживает автоматически заголовок текущей ветви в своем рабочем каталоге.Если вы выполните git reset --hard на сервере, вы должны увидеть правильные файлы.

Причина, по которой похоже, что ваш тестовый файл был удален, заключается в том, что заголовок указывает на новый коммит, который вы нажали, но измененияфактически не были внесены в рабочий каталог;только в историю.Таким образом, различия между заголовком и текущим каталогом включают отсутствующий файл.Таким образом, Git предполагает, что он был удален.

Это одна из причин, по которой репозитории на серверах пусты.Никто не должен работать в этом хранилище на самом сервере, поэтому нет никаких оснований для того, чтобы у него был рабочий каталог.

0 голосов
/ 02 февраля 2012

Вы говорите: «В .git / hooks у меня есть push -обновление файла», но файл должен называться post -update.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...