Эффективно ли использовать Git и Dropbox? - PullRequest
1105 голосов
/ 25 декабря 2009

Как мне эффективно использовать Git и Dropbox вместе?

Ответы [ 19 ]

1373 голосов
/ 25 декабря 2009

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

Настройка выглядит примерно так:

~/project $ git init
~/project $ git add .
~/project $ git commit -m "first commit"
~/project $ cd ~/Dropbox/git

~/Dropbox/git $ git init --bare project.git
~/Dropbox/git $ cd ~/project

~/project $ git remote add origin ~/Dropbox/git/project.git
~/project $ git push -u origin master

Оттуда вы можете просто клонировать ~/Dropbox/git/project.git, который вы связали с вашей учетной записью Dropbox (или поделились этим каталогом с людьми), вы можете выполнять все обычные операции Git, и они будут синхронизироваться со всеми другими вашими компьютерами автоматически .

Я написал сообщение в блоге, Об управлении версиями , ( старая ссылка dead ) о моих рассуждениях и способах настройки моя среда основана на моем опыте разработки Ruby on Rails , но на самом деле его можно применить ко всему.

114 голосов
/ 26 августа 2015

Правильный способ сделать это - использовать git-remote-dropbox: https://github.com/anishathalye/git-remote-dropbox

Создание собственного голого репо в Dropbox вызывает много проблем. Аниш (создатель библиотеки) объясняет это лучше всего :

Основной причиной этих проблем является то, что рабочий стол Dropbox Клиент предназначен для синхронизации файлов, а не репозиториев Git. Без специальная обработка для Git-репозиториев, она не поддерживает то же самое гарантии как Git. Операции с удаленным репозиторием больше не выполняются атомарные и параллельные операции или неудачное время с синхронизация может привести к повреждению хранилища.

Традиционные пульты Git запускают код на стороне сервера, чтобы заставить эту работу правильно, но мы не можем этого сделать.

Решение: это можно решить правильно. Можно использовать Git с Dropbox и имеют такие же гарантии безопасности и согласованности как традиционный Git Remote, даже если есть несколько пользователей и параллельные операции!

Для пользователя это так же просто, как использовать git-remote-dropbox, удаленный Git помощник, который действует как прозрачный двунаправленный мост между Git и Dropbox и поддерживает все гарантии традиционного пульта Git. Его даже безопасно использовать с общими папками, поэтому его можно использовать для сотрудничество (безлимитные частные репо с неограниченным сотрудники!).

С помощью удаленного помощника можно использовать Dropbox в качестве удаленного Git и продолжайте использовать все обычные команды Git, такие как git clone, git потяните и нажмите git push, и все будет работать так, как ожидалось.

87 голосов
/ 02 мая 2011

Этот ответ основан на Mercurial опыте, а не Git, но этот опыт говорит, что использование Dropbox таким способом запрашивает поврежденные репозитории, если даже есть вероятность, что вы будете обновлять тот же репозиторий на основе Dropbox с разных машин в разное время (Mac, Unix, Windows в моем случае).

У меня нет полного списка вещей, которые могут пойти не так, но вот конкретный пример, который меня укусил. У каждого компьютера есть свое представление о символах конца строки и о том, как символы верхнего и нижнего регистра обрабатываются в именах файлов. Dropbox и Git / Mercurial обрабатывают это немного по-разному (я не помню точных различий). Если Dropbox обновляет хранилище за спиной Git / Mercurial, presto, сломанное хранилище. Это происходит немедленно и незаметно, поэтому вы даже не знаете, что ваш репозиторий сломан, пока не попытаетесь что-то восстановить из него.

После того, как я покопался в одном беспорядке, делая что-то подобное, я использовал следующий рецепт с большим успехом и без каких-либо проблем. Просто переместите свой репозиторий из Dropbox. Используйте Dropbox для всего остального; документация, JAR-файлы , все что угодно. И используйте GitHub (Git) или Bitbucket (Mercurial) для управления самим хранилищем. Оба бесплатны, так что это ничего не добавляет к затратам, и теперь каждый инструмент играет на своих сильных сторонах.

Запуск Git / Mercurial поверх Dropbox ничего не добавляет, кроме риска. Не делай этого.

16 голосов
/ 04 декабря 2012

Что касается небольших команд, использующих Dropbox:

Если у каждого разработчика есть свой собственный доступный для записи пустой репозиторий в Dropbox, который извлекает только для других разработчиков, то это облегчает совместное использование кода без риска повреждения!

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

16 голосов
/ 02 декабря 2010

Я не хотел помещать все свои проекты в один репозиторий Git, и при этом я не хотел входить и запускать этот код для каждого отдельного проекта, поэтому я создал Bash скрипт, который будет автоматизировать процесс. Вы можете использовать его в одном или нескольких каталогах - так что он может сделать код в этом посте для вас, или он может сделать это для нескольких проектов одновременно.

#!/bin/sh
# Script by Eli Delventhal
# Creates Git projects for file folders by making the origin Dropbox. You will need to install Dropbox for this to work.

# Not enough parameters, show help.
if [ $# -lt 1 ] ; then

cat<<HELP
projects_to_git.sh -- Takes a project folder and creates a Git repository for it on Dropbox

USAGE:
    ./projects_to_git.sh file1 file2 ..

EXAMPLES:
    ./projects_to_git.sh path/to/MyProjectDir
        Creates a git project called MyProjectDir on Dropbox

    ./projects_to_git.sh path/to/workspace/*
        Creates a git project on Dropbox for every folder contained within the workspace directory, where the project name matches the folder name

HELP
    exit 0
fi

# We have enough parameters, so let's actually do this thing.

START_DIR=$(pwd)

# Make sure we have a connection to Dropbox
cd ~
if [ -s 'Dropbox' ] ; then
    echo "Found Dropbox directory."
    cd Dropbox
    if [ -s 'git' ] ; then
        echo "    Dropbox Git directory found."
    else
        echo "    Dropbox Git directory created."
        mkdir git
    fi
else
    echo "You do not have a Dropbox folder at ~/Dropbox! Install Dropbox. Aborting..."
    exit 0
fi

# Process all directories matching the passed parameters.
echo "Starting processing for all files..."
for PROJ in $*
do
    if [ -d $PROJ ] ; then
        PROJNAME=$(basename $PROJ)
        echo "  Processing $PROJNAME..."

        # Enable Git with this project.
        cd $PROJ
        if [ -s '.git' ] ; then
            echo "    $PROJNAME is already a Git repository, ignoring..."
        else
            echo "    Initializing Git for $PROJNAME..."
            git init -q
            git add .
            git commit -m "Initial creation of project." -q

            # Make the origin Dropbox.

            cd ~/Dropbox/git
            if [ -s $PROJNAME ] ; then
                echo "    Warning! $PROJNAME already exists in Git! Ignoring..."
            else
                echo "    Putting $PROJNAME project on Dropbox..."
                mkdir $PROJNAME
                cd $PROJNAME
                git init -q --bare
            fi

            # Link the project to the origin
            echo "    Copying local $PROJNAME to Dropbox..."
            cd $PROJ
            git remote add origin "~/Dropbox/git/$PROJNAME"
            git push -q origin master
            git branch --set-upstream master origin/master
        fi
    fi
done

echo "Done processing all files."
cd $START_DIR
15 голосов
/ 23 августа 2015

Сейчас 2015, и по состоянию на три дня назад был создан новый инструмент на основе Dropbox API v2 для безопасного использования git на Dropbox. Он работает против API, а не с помощью клиента рабочего стола, и правильно обрабатывает несколько одновременных запросов в хранилище, размещенное в общей папке.

После настройки он позволяет настроить git remote точно так же, как и любой другой git remote.

git clone "dropbox::/path/to/repo"
git remote add origin "dropbox::/path/to/repo"
15 голосов
/ 26 мая 2010

Я не думаю, что использование Git и Dropbox - это путь ... Просто подумайте об особенностях обоих:

Git:

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

Dropbox:

  • Хранит все в центральном хранилище
  • Позволяет вам иметь собственные версии файлов на сервере
  • Принудительно отправляет и получает изменения из центрального хранилища
  • Если несколько человек изменяют одни и те же файлы, первый зафиксированный файл заменяется более поздним подтверждением, и слияние не происходит, что является проблематичным (и определенно его самым большим недостатком)
  • Имеет веб-клиенты и клиенты для доступа к центральному хранилищу.

А если вы беспокоитесь о том, чтобы поделиться некоторыми своими файлами, почему бы не зашифровать их? И тогда вы сможете получить самое большое преимущество Dropbox для Git, то есть иметь открытые и закрытые файлы ...

9 голосов
/ 03 марта 2014

Я использую Mercurial (или Git) + TrueCrypt + Dropbox для зашифрованных удаленных резервных копий .

Самое классное, что Dropbox НЕ синхронизирует весь контейнер TrueCrypt, если вы модифицируете небольшую часть вашего кода. Время синхронизации примерно пропорционально количеству изменений. Несмотря на то, что он зашифрован, комбинация TrueCrypt + Dropbox отлично использует блочный шифр + синхронизацию на уровне блоков.

Во-вторых, монолитный зашифрованный контейнер не только повышает безопасность, но и снижает вероятность повреждения хранилища .

Внимание: Однако вы должны быть очень осторожны, чтобы не установить контейнер во время работы Dropbox. Также может быть затруднительно разрешать конфликты, если 2 разных клиента регистрируют разные версии в контейнере. Так что это практично только для одного человека, использующего его для резервного копирования, а не для команды.

Установка:

  • Создание контейнера Truecrypt (подходит несколько гигабайт)
  • В настройках Truecrypt снимите флажок preserve modification timestamp*.
  • Создать репо, как было упомянуто выше, Дэн (https://stackoverflow.com/a/1961515/781695)

Использование:

  • Выйти из Dropbox
  • Смонтируйте контейнер, вставьте изменения, размонтируйте
  • Запустить Dropbox

P.S. Снятие отметки preserve modification timestamp говорит о том, что файл был изменен и должен быть синхронизирован. Обратите внимание, что монтирование контейнера изменяет временную метку, даже если вы не измените в ней файл. Если вы не хотите, чтобы это происходило, просто смонтируйте том как read-only

6 голосов
/ 04 марта 2011

Я использую Mercurial рекомендованным способом и призываю вас быть осторожными, особенно если какая-либо из машин отличается. Форум Dropbox полон жалоб на таинственные проблемы с именами файлов, возникающих спонтанно. Hg (и я предполагаю, что Git) не будет замечать или жаловаться во время рутинных проверок, и вы будете слышать о коррупции только тогда, когда он жалуется на поврежденное хранилище, когда вы пытаетесь использовать его по-настоящему. Плохие новости. Хотел бы я быть более конкретным о проблеме и ее обходных путях; Я все еще пытаюсь выкопать из этого беспорядка сам.

6 голосов
/ 17 февраля 2011

Мне нравится ответ Дэна МакНевина! Сейчас я тоже использую Git и Dropbox вместе, и в своем .bash_profile я использую несколько псевдонимов, поэтому мой рабочий процесс выглядит так:

~/project $ git init
~/project $ git add .
~/project $ gcam "first commit"
~/project $ git-dropbox

Вот мои псевдонимы:

alias gcam='git commit -a -m'
alias gpom='git push origin master'
alias gra='git remote add origin'
alias git-dropbox='TMPGP=~/Dropbox/git/$(pwd | awk -F/ '\''{print $NF}'\'').git;mkdir -p $TMPGP && (cd $TMPGP; git init --bare) && gra $TMPGP && gpom'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...