#git #git-stash
#git #git-stash
Вопрос:
Я пытаюсь настроить репозиторий git с заданным вручную рабочим деревом через:
cd /Users/braitsch/repos/project1
git --git-dir=. --work-tree=/Users/braitsch/projects/project1 init
После выполнения вышеописанного я могу добавить файлы, расположенные в «/ Users / braitsch / projects / project1»
через: git add somefile или git add .
Коммиты работают нормально, как и вызовы «git branch»
Однако, git stash list
выдает следующую ошибку:
фатальный: /usr/local /Cellar/git /1.7.4.4/libexec /git-core / git-stash нельзя использовать без рабочего дерева.
Не поддерживается ли сохранение в пользовательских рабочих деревьях?
git config --local core.worktree
echoes out : /Users/braitsch/projects/project1
Любые мысли были бы высоко оценены!
———ОБНОВИТЬ———
Как отметил @jleedev ниже, похоже, что при попытке вызвать «git stash» извне рабочего дерева произошла ошибка. Однако мой обходной путь заключается в том, чтобы просто войти в worktree, а затем вызвать stash, предварительно указав путь к gitdir. Неудобно, я знаю, но для команды stash работает следующее:
git --git-dir="projects/proj1/.git" stash list
Похоже, что эта проблема не затрагивает другие стандартные команды, такие как add, commit, branch и т.д. Насколько я могу судить, просто «stash».
Если вы хотите отказаться от структуры по умолчанию, в которой ваша папка .git вложена внутрь вашего рабочего дерева, вам могут оказаться полезными следующие шаги:
- создайте каталог, в котором вы хотели бы сохранить свой репозиторий git
- создайте каталог, в котором вы хотите сохранить файлы, которые вы собираетесь отслеживать (оба они могут находиться в любом месте вашей файловой системы)
-
вставьте компакт-диск в папку вашего репозитория git и запустите:
git --git-dir=. --work-tree="path-to-your-project-folder" init
Это инициализирует новый репозиторий и свяжет его с вашей внешней папкой worktree.
Чтобы запустить стандартные команды добавления, удаления, ветвления, фиксации, перейдите в свой репозиторий git и запустите свою команду как обычно. Однако, чтобы запустить stash, обязательно зайдите на cd в ваше рабочее дерево, а затем запустите stash, как я отметил выше, предваряя команду путем к вашему gitdir.
Ответ №1:
Это либо ошибка в поведении команды, либо сообщение об ошибке. Команды, которым требуется рабочее дерево и которые реализованы в виде сценариев1, проверяют его наличие с помощью этой команды:
git rev-parse --is-inside-work-tree
что приведет к сбою, если вы на самом деле не находитесь внутри рабочего дерева, вопреки тому, что подразумевает сообщение об ошибке. С другой стороны, команды, которые реализованы на C, вызывают setup_work_tree
, которые автоматически chdir
помещаются в рабочее дерево. Можно ли безопасно изменить require_work_tree
функцию в git-sh-setup
в соответствии с этим, я не знаю.
1. git-am.sh git-bisect.sh git-mergetool.sh git-pull.sh git-rebase--interactive.sh git-rebase.sh git-stash.sh git-submodule.sh
Комментарии:
1. Спасибо за ответ «да», похоже, это ошибка. Пожалуйста, посмотрите мое дополнение к моему первоначальному вопросу выше.
Ответ №2:
Редактировать:
Попробуйте установить переменную среды GIT_WORK_TREE так, чтобы она указывала на подходящую папку.
Оригинальный ответ:
Это была немного странная команда. Попробуйте это вместо этого. Это намного проще:
mkdir yourRepo
cd yourRepo
git init
.. edit some files
git add .
git commit -m "First commit"
Комментарии:
1. Привет, это не решает проблему. «git init» просто инициализирует новый репозиторий в вашем текущем рабочем каталоге. Я пытаюсь определить рабочее дерево в другом месте файловой системы с помощью команд в моем примере выше. Однако, похоже, что когда вы делаете это, команда git stash завершается ошибкой.
Ответ №3:
Я столкнулся с этим, используя git для Windows 1.8.3 через ConEmu.
Моя проблема, похоже, была связана с отображением диска, которое у меня было, которое отображало путь на C:
диске к P:
git распознал путь к подключенному диску как /p
в командной строке, но настройка для git config --local core.worktree
возвращалась P:/
Я сбросил его, используя git config --local core.worktree /p
, который дал мне p:/
новое значение, но это исправленный stash. Похоже, ему не понравилась заглавная буква диска.
Оказывается, мне просто нужно было cd /c
, а затем cd /p
, чтобы git заметил, что я вошел в каталог рабочего дерева. Не уверен, почему git чувствителен к cd
, но не смог обнаружить, что я был в нужном месте, когда оболочка была инициализирована.