Git - несколько рабочих копий без голой копии между ними

Похожий на:

Я пытаюсь понять шаги рабочего процесса, чтобы выполнить следующее:

  1. Having worked locally on "home", I want to start a repository in W:\DEV\proj1
    • git init W:\DEV\proj1
    • cd W:\DEV\proj1
    • git add *
    • git commit -m"1st home"
  2. I then want to clone this repo to "portable" somewhere else (i.e. a usbkey), lets say P:\DEV\roam1
    • git clone . P:\DEV\roam1
  3. Then I want to be able to do work in either location ("home" or "portable") and sync changes back and forth.
    • (in portable)
      • // new file f1.txt
      • git add *
      • git commit -m"1st portable"
      • git ??? - синхронизировать f1.txt> "домой"?
    • (in home)
      • // new file f2.txt
      • git add *
      • git commit -m"2nd home"
      • git ??? - синхронизировать f2.txt> "переносной"
    • повторение

Часть A) Мне кажется, я понимаю, как клонировать и синхронизировать с «централизованным концентратором», то есть с github, или помещать голое репо на USB-накопитель и клонировать с него всякий раз, когда я нахожусь в новом месте, но я бы предпочел не клонировать из переносимого репозитория каждый раз, когда я хочу выполнить работу в новом месте. Кроме того, в случае, когда я просто хочу посмотреть файл на компьютере, на котором не установлен git.

Часть B). Другой применимый сценарий заключается в том, что я хочу использовать git для резервного копирования каталога на внешний жесткий диск (который, как правило, нормально переносится на чистый репозиторий), но я хочу получить доступ к файлы на жестком диске другого компьютера без установленного git.


person drzaus    schedule 07.08.2013    source источник
comment
Что касается части B, я предполагаю, что можно было бы просто клонировать на жесткий диск, а затем периодически запускать git pull с жесткого диска для получения последних изменений?   -  person drzaus    schedule 07.08.2013
comment
Я собираюсь подробнее ознакомиться с этим сообщением swoes.blogspot.com/2009/02/   -  person drzaus    schedule 07.08.2013
comment
Очки за попытку различить ваш вопрос.   -  person Simon Shine    schedule 09.09.2015


Ответы (2)


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

Вам не придется, кроме как инициализировать свое репо в новом месте (в этом случае вы должны клонировать голое репо своей USB-флешки в своей локальной среде)

Каждый раз, когда вы хотите выполнить работу, вы должны:

  • убедитесь, что пульт с именем origin вашего локального репо указывает на голое репо на USB-накопителе.
  • git pull (или git pull --rebase), чтобы вернуть потенциальные изменения с USB на локальные.
  • Работа
  • git push (назад к клавише usb)

Вам нужно какое-то «централизованное / портативное» репо, из которого можно вытащить / отправить.


нежелание, чтобы "централизованный концентратор" был простым репо, это то, что, скажем, я использую другой компьютер без git, и я хочу просто показать кому-то файл

Я бы по-прежнему рекомендовал голое репо на USB-накопителе, но я бы добавил пост-приемник к этому голому репо, чтобы обновить отдельное рабочее дерево (все еще на флешку)

См. «Хотите настроить ловушку, которая копирует зафиксированные файлы в определенную папку» в качестве примера такой ловушки.

Таким образом, в моей «централизованной и переносной» среде хостинга репозитория git (то есть USB-ключ!) У меня всегда есть:

  • голое репо (я могу клонировать / вытаскивать / нажимать)
  • полное рабочее дерево с последними коммитами.
person VonC    schedule 07.08.2013
comment
Я хочу сказать, что не хочу, чтобы централизованный концентратор был простым репо: допустим, я использую другой компьютер без git и хочу просто показать кому-то файл - мне нужны файлы, доступные на портативном устройстве устройство, не упакованное. Уточню свой вопрос. - person drzaus; 07.08.2013
comment
@drzaus Я обновил свой ответ, чтобы учесть ваш последний пункт. - person VonC; 07.08.2013
comment
так что в основном это похоже на обычное репозиторий git (project / - ›[.git / + рабочие файлы]), но папка .git - это голое репо в одной папке, а рабочие файлы пост-перехватываются в другую папку, отличную от git ([project.git / + project.working /])? - person drzaus; 08.08.2013
comment
@drzaus да, у вас есть две папки на этом USB-ключе: одна - это голое репо, другая - рабочее дерево, обновленное обработчиком post-receive из чистого репо. - person VonC; 08.08.2013
comment
Спасибо за объяснение. просто для явного подтверждения, папка рабочего дерева - это либо: 1) репозиторий git, который может фиксироваться обратно на голый, или 2) просто плоские файлы только для просмотра? если №1, разве это не дублирует базу данных .git? если № 2, могу ли я внести изменения на компьютере, отличном от Git, и передать их обратно в систему контроля версий? - person drzaus; 08.08.2013
comment
@drzaus 2): вы оформляете заказ из чистого репо в другую папку: без дублирования. Это то, что делает команда (из этого вопроса) git --git-dir=/path/to/project_root.git --work-tree=/path/to/your/workingtree checkout -f: здесь задействовано только одно репо. Никакого дублирования. - person VonC; 08.08.2013
comment
Думаю, я разобрался с обоими сценариями #amiright @VonC? stackoverflow.com/a/20132742/1037948 - person drzaus; 22.11.2013

Конкретный пример, основанный на ответе @VonC.

УСТРОЙСТВА

  • LOCAL = ваш локальный компьютер, т.е. C:\MyDocuments\Whatever
  • PORTABLE = что-то еще, например USB-ключ

РЕПО

  • LOCAL/myproject/ = репозиторий "изо дня в день", в котором вы выполняете свою работу, отправляете на github и т. Д.
  • PORTABL/myproject.git = голый "централизованный хаб" (на usb ключе)
  • PORTABLE/myproject-preview = не-git папка, содержащая последний код из репозитория
  • PORTABLE/myproject-working = репозиторий git, с которым можно работать, когда не дома (в основном то же, что и LOCAL/myproject

Файловая структура

ПРИМЕЧАНИЕ. Я тестирую все это в одной папке на моем компьютере, а не на отдельных дисках, YMMV.

-LOCAL/
   -myproject/
      -.git/
      - other files

-PORTABLE/
   -myproject.git/
       -hooks/
       -info/
       <etc>
   -myproject-preview/
      - other files
   -myproject-working/
      -.git
      - other files

КОНФИГУРАЦИЯ

прим. команд ... предполагается, что вы сначала работали локально, до этого мозгового штурма

# start at home
cd LOCAL
git init myproject
<do some work>
# suddenly you realize you want a portable hub
cd PORTABLE
# ready the dump locations (depending on what you want)
mkdir myproject-preview
mkdir myproject-working
# start the hub
git init myproject.git --bare
<make the post-receive hook, see below *not cool enough to do it from the command line>
# backup home
cd LOCAL/myproject
git remote add origin PORTABLE/myproject.git
git push origin master #this shows up in ...preview and ...working
<do more work>

Пост-приемный крючок

С любовью скопировано из другого ответа и случайный кодерволл.

Вы можете сделать и то, и другое, либо выбрать просто «режим предварительного просмотра» или «переносная работа».

Обратите внимание на использование относительных путей (поскольку мы находимся в PORTABLE/myproject.git/hooks/).

#!/bin/bash
while read oldrev newrev refname
do
    branch=$(git rev-parse --symbolic --abbrev-ref $refname)
    if [ "master" == "$branch" ]; then
        # preview mode
        git --git-dir=../myproject.git --work-tree=../myproject-preview checkout -f
        # portable working mode (https://coderwall.com/p/oj5smw)
        GIT_WORK_TREE=../myproject-portable git checkout -f $branch
    fi
done
person drzaus    schedule 21.11.2013