Как настроить локальный репозиторий Git и локальный каталог резервного копирования? - PullRequest
4 голосов
/ 26 февраля 2011

UPDATE

Я настроил два репозитория Git, следуя указаниям одного из ответов ниже, но в каталоге резервных копий нет копий файлов в рабочем каталоге. Это то, что я вижу в каталоге резервных копий ...

$ ls
total 0
drwxr-xr-x  10 Hristo  staff  340 Feb 25 21:40 Kamma.git

... но я ожидал что-то вроде следующего ...

$ ls
total 16
drwxr-xr-x   6 Hristo  staff   204 Dec 19 19:51 css
drwxr-xr-x   3 Hristo  staff   102 Nov 13 18:00 images
-rw-r--r--@  1 Hristo  staff  4440 Feb 26 03:20 index.html
drwxr-xr-x  15 Hristo  staff   510 Feb 24 14:19 js

Опять же, я хочу, чтобы мой основной рабочий каталог, /Users/Hristo/Sites/Kamma, был тем местом, где я делаю изменения и делаю коммиты и возвраты и тому подобное.

Я хочу, чтобы /Users/Hristo/Sites/Kamma_bak был тем местом, где я периодически отправляю важные изменения, например, новую версию моего проекта, где все является копией моего рабочего каталога, но не самой последней копией.

Надеюсь, это имеет смысл.


Оригинальный пост

Я хотел бы создать локальный репозиторий Git. Так, например, я хотел бы, чтобы мое основное местоположение было /Users/Hristo/Sites/Kamma, где я буду выполнять всю свою работу.

Я надеюсь, что смогу зафиксировать изменения и вернуться к предыдущим версиям и т. Д., Как работает Subversion. Но я также хотел бы иметь резервный каталог, /Users/Hristo/Sites/Kamma_bak, в качестве отказоустойчивого, где я бы «выдвигал» версии время от времени.

В этом каталоге резервного копирования /Users/Hristo/Sites/Kamma_bak я бы хотел, чтобы все файлы и такие файлы существовали в виде дубликатов, как резервные копии рабочего каталога /Users/Hristo/Sites/Kamma

Как бы я сделал это с Git? Он уже установлен на моей машине под управлением Snow Leopard.

Ответы [ 3 ]

5 голосов
/ 26 февраля 2011

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

Пожалуйста, прочитайте эту ветку, Эффективно ли вы используете Git и Dropbox?

Я думаю, что инструкции предоставляют именно то, чтоты ищешь;часть «dropbox», конечно, необязательна (это просто папка).

EDIT: Забудьте о бите dropbox.Dropbox - это просто локальная папка + служба, которая копирует ее вне офиса.Эти инструкции будут работать и для вас С ЛОКАЛЬНОЙ ПАПКОЙ.

Важный бит это создать (локальное) голое репо, которое вы настроили как «git remote», и подтолкнуть ваши изменения к.

Позвольте мне скопировать и вставить из цитируемой ветки и внести изменения для вас.

Примерно так должно работать:

~/Sites/Kamma $ git init
~/Sites/Kamma $ git add .
~/Sites/Kamma $ git commit -m "first commit"
~/Sites/Kamma $ cd ~/Sites/Kamma_bak

~/Sites/Kamma_bak $ mkdir Kamma.git
~/Sites/Kamma_bak $ cd Kamma.git
~/Sites/Kamma_bak $ git init --bare
~/Sites/Kamma_bak $ cd ~/Sites/Kamma

~/Sites/Kamma $ git remote add origin ~/Sites/Kamma_bak/Kamma.git
~/Sites/Kamma $ git push origin master
1 голос
/ 27 февраля 2011

Примечание. «Резервная» копия на том же компьютере не является большой частью резервной копии (особенно если она находится на том же диске).Чтобы быть надежным, вам действительно нужно скопировать свои данные на одну (или более!) Другую машину / носитель, предпочтительно в разные места.

Похоже, ваша «резервная копия» - это голое хранилище , но вы хотите, чтобы это был не пустой репозиторий (т. е. вы хотите, чтобы у него было проверено собственное рабочее дерево).

Проблема в том, что отправка в не пустой репозиторий обычно не является хорошей идеей.По сути, такие нажатия могут обновить ветку, на которую указывает HEAD, без обновления индекса или рабочего дерева.Это может привести к очень запутанным ситуациям в принимающем репозитории (например, добавленные файлы показаны с удаленным статусом и т. Д.).По этой причине в версиях Git 1.7.0 и более поздних по умолчанию отказываются принимать запросы в извлеченную в настоящее время ветвь ненастроенных репозиториев.

Примечание. При переносе в пустой репозиторий для целей резервного копирования всефайлы, содержащиеся в отправленных коммитах, есть, они просто не извлекаются (они сжимаются и хранятся в хранилище объектов Git как «свободные объекты» и «файлы пакета»).Выдвинутые данные представляют собой полную копию истории контента, который вы зафиксировали и отправили.Вы просто не можете получить доступ к контенту напрямую.Вместо этого вы должны клонировать его в репозиторий не-голого репозитория (и, таким образом, получить фиксацию) или использовать git archive для извлечения набора файлов без дополнительного репозитория или полной проверки.


Яне совсем уверен, что вам нужно что-то похожее на то, что вы описываете.

Если вам нужно изучить старый снимок вашего хранилища (и вам не хочется делать это в обычном рабочем хранилище), то вам просто нужно клонироватьвременная копия и проверка желаемого, старого коммита.Локальные клоны дешевы, так как они могут жестко связывать файлы хранилища объектов вместо их копирования.График исторической фиксации - это, как правило, все, что вам нужно, чтобы «вернуться в прошлое».Хотя Git позволит вам переписывать граф истории по своему усмотрению, вы не подвергаетесь большой опасности внесения невосстановимых изменений, поскольку обычно для этого требуются переключатели -f / --force и / или предусмотрены механизмы восстановления (reflogs, refs / original /, минимумвозрастные требования перед сбором объектов, на которые нет ссылок, и т. д.).

Это - это хорошая идея иметь другой репозиторий (особенно на другом компьютере в другом месте), куда вы можете отправлять свои коммиты в целях резервного копирования.(так что вы можете восстановить из (например) rm -rf working_repo), но чистого хранилища обычно вполне достаточно.Когда вам нужно восстановиться, вы просто делаете клон.Если вы хотите просмотреть какой-то старый снимок, не нарушая нормальное рабочее хранилище, вы делаете где-то временный клон.При надлежащей гигиене фиксации git diff, git log (особенно опции -p и -S) и git show могут часто предоставлять любую «археологическую» информацию, которая вам может потребоваться при старых фиксациях, без необходимости что-либо проверять.(они даже работают в голых репозиториях).


Однако, если вы готовы принять риск, вы можете делать именно то, что вы хотите.

Git, как и любой другой «острый»», Вы рискуете« выстрелить себе в ногу »(простите за смешанную метафору).

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

    # paths to the repositories
    WORKING=/path/to/working
    BACKUP=/path/to/backup
    
    # name for the backup repository in the working repository
    REMOTE=backup
    
    ! test -d "$BACKUP" || (echo "error: $BACKUP already exists"; exit 1) &&
    git clone --origin working "$WORKING" "$BACKUP" &&
    ( cd "$BACKUP" &&
      git config receive.denyCurrentBranch false &&
      git remote rm working
    ) &&
    ( cd "$WORKING" &&
      git remote add "$REMOTE" "$BACKUP" &&
      git config remote."$REMOTE".push 'refs/heads/*:refs/heads/*'
    )
    
  2. В хранилище резервных копий установите хук post-receive или post-update, который делает git reset --hard.Это будет поддерживать индекс и рабочее дерево в актуальном состоянии с текущей извлеченной веткой.

    Git FAQ «Почему я не увижу изменения в удаленном репо после»git push "?" указывает на пример post-update script , который может сделать это относительно безопасно (он сохраняет тайник, если рабочее дерево или индекс грязные - это может привести к потере неотслеживаемых файлов, еслидобавляются только что добавленные файлы с теми же путями).

    ( H="$BACKUP"/.git/hooks/post-update &&
      curl http://utsl.gen.nz/git/post-update >$H && chmod +x "$H" )
    
  3. Нажмите для резервного копированияЕсли вы хотите обновить его.

    (cd "$WORKING" && git push "$REMOTE")
    

Если вы используете такую ​​настройку, вам следует полностью избегать работы в рабочем дереве резервного копирования. Любые коммиты, которые вы делаете там, любые поэтапные изменения, которые вы оставляете там, и любые неотслеживаемые файлы, которые вы оставляете там, могут быть потеряны.

1 голос
/ 26 февраля 2011

git init создаст git-репо. Чтобы сделать резервную копию, сделайте git clone --no-hardlinks на исходном репо, чтобы скопировать его. Оттуда вы можете сделать толчок из одного репо в другой.

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