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


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

19 1067

19 ответов:

Я думаю, что 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, и они будут автоматически синхронизированы со всеми вашими другими машинами.

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

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

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

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

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

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

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

с удаленный помощник, можно использовать Dropbox в качестве git remote и продолжайте использовать все обычные команды Git, такие как git clone, git тяните, и ГИТ толкайте, и все будет работать так, как ожидалось.

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

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

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

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

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

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

тогда, если вы хотите централизованную "магистраль", вы можете иметь один разработчик управлять всеми толчками к нему из своего собственного РЕПО.

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

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

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

Git:

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

Dropbox:

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

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

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

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

git clone "dropbox::/path/to/repo"
git remote add origin "dropbox::/path/to/repo"

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

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

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

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

настройка:

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

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

  • Выйти Из Dropbox
  • установите контейнер, нажмите ваши изменения, размонтировать
  • Run dropbox

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

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

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

~/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'

мы используем этот метод (создание пустого репозитория в Dropbox) на папку.

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

одна вещь, которую мне не хватает,-это хороший способ отправить электронное письмо с информацией о наборе изменений после того, как произойдет толчок к origin. Мы используем Google Wave, чтобы вручную отслеживать изменения.

есть также проект с открытым исходным кодом (коллекция кросс-платформенных скриптов [Linux, Mac, Win]), который выполняет все мелкие детали управления репозиторием с помощью нескольких (3-4) команд.

https://github.com/karalabe/gitbox/wiki

пример использования:

$ gitbox create myapp
Creating empty repository...
Initializing new repository...
Repository successfully created.

$ gitbox clone myapp
Cloning repository...
Repository successfully cloned.

после чего нормальное использование git:

$ echo “Some change” > somefile.txt
$ git add somefile.txt
$ git commit –m “Created some file”
$ git push

Проверьте проект wiki и руководства для полного руководства по команде и учебники.

Я храню свои репо без Github на Dropbox. Одно предостережение, с которым я столкнулся, было синхронизацией после переустановки. Dropbox сначала загрузит самые маленькие файлы, прежде чем перейти к более крупным. Не проблема, если вы начинаете ночью и вернуться после выходных : -)

мой поток - http://forums.dropbox.com/topic.php?id=29984&replies=6

мне нравится голосующий сверху ответ Дэна Макневина. Я слишком много раз выполнял последовательность команд git и решил сделать сценарий. Так вот оно:

#!/bin/bash

# Usage
usage() {
    echo "Usage:  -m [ master-branch-directory ] -r [ remote-branch-directory ] [ project-name ]"
    exit 1
}

# Defaults
defaults() {
    masterdir="${HOME}/Dropbox/git"
    remotedir="${PWD}"
    gitignorefile="# OS generated files #\n\n.DS_Store\n.DS_Store?\n.Spotlight-V100\n.Trashes\nehthumbs.db\nThumbs.db"
}

# Check if no arguments
if [ ${#} -eq 0 ] ; then
    echo "Error: No arguments specified"
    usage
fi

#Set defaults
defaults

# Parse arguments
while [ ${#} -ge 1 ]; do
    case "" in
        '-h' | '--help' ) usage ;;
        '-m' )
            shift
            masterdir=""
            ;;
        '-r' )
            shift
            remotedir=""
            ;;
        * )
            projectname="${1##*/}"
            projectname="${projectname%.git}.git"
            ;;
    esac
    shift
done

# check if specified directories and project name exists
if [ -z "${projectname}" ]; then
    echo "Error: Project name not specified"
    usage
fi

if [ ! -d "${remotedir}" ]; then
    echo "Error: Remote directory ${remotedir} does not exist"
    usage
fi

if [ ! -d "${masterdir}" ]; then
    echo "Error: Master directory ${masterdir} does not exist"
    usage
fi

#absolute paths
remotedir="`( cd \"${remotedir}\" && pwd )`"
masterdir="`( cd \"${masterdir}\" && pwd )`"

#Make master git repository
cd "${masterdir}"
git init --bare "${projectname}"

#make local repository and push to master
cd "${remotedir}"
echo -e "${gitignorefile}" > .gitignore # default .gitignore file
git init
git add .
git commit -m "first commit"
git remote add origin "${masterdir}/${projectname}"
git push -u origin master

#done
echo "----- Locations -----"
echo "Remote branch location: ${remotedir}"
echo "Master branch location: ${masterdir}"
echo "Project Name: ${projectname}"

сценарий требует только имя проекта. Он будет генерировать репозиторий git в ~/Dropbox/git/ под указанным именем и переместит все содержимое текущего каталога во вновь созданную ветвь origin master. Если задано более одного имени проекта, будет использоваться самый правый аргумент имени проекта.

при необходимости аргумент команды-r указывает удаленную ветвь, которая будет передаваться на исходный мастер. Расположение оригинала проекта также можно указать с помощью аргумента-m. Неисполнение. файл gitignore также помещается в каталог удаленного филиала. В справочнике И.в скрипте задаются значения по умолчанию для файла gitignore.

Теперь в 2014 году я использую Git и Dropbox около полутора лет без проблем. Хотя некоторые моменты:

  • все мои машины, использующие Dropbox, находятся на Windows, разных версиях (от 7 до 8) + 1 mac.
  • Я не делюсь репозиторием с кем-то еще, поэтому я единственный, кто его модифицирует.
  • git push толкает к удаленному репозиторию, так что если он когда-либо будет поврежден, я могу легко восстановить его.
  • Я должен был создать псевдонимы в C:\Users С mklink /D link target потому что некоторые библиотеки были указаны в абсолютных местах.

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

скрипт доступен по адресу https://github.com/nuttylabs/box-git.

другой подход:

все ответы до сих пор, в том числе @дан ответ что является наиболее популярным, обратитесь к идее использования Dropbox для централизации общего репозитория вместо использования сервиса, ориентированного на git, такого как github, bitbucket и т. д.

но, поскольку в исходном вопросе не указано, что на самом деле означает использование "Git и Dropbox вместе", давайте работать над другим подходом: "Использование Dropbox для синхронизации только worktree."

how-to имеет следующие шаги:

  1. внутри каталога проекта создается пустой (например,mkdir -p myproject/.git)

  2. отменить синхронизацию .git каталог в Dropbox. При использовании приложения Dropbox: перейдите в раздел Настройки, синхронизация и "выберите папки для синхронизации", где .git каталог должен быть немаркирован. Это позволит удалить .

  3. run git init в каталог проекта

он также работает, если .git уже существует, то только на Шаге 2. Однако Dropbox сохранит копию файлов git на веб-сайте.

Шаг 2 приведет к тому, что Dropbox не будет синхронизировать структуру системы git, что является желаемым результатом для этого подхода.

зачем использовать такой подход?

  • еще не нажатые изменения будут иметь резервную копию Dropbox, и они будут синхронизированы на разных устройствах.

  • в случае, если Dropbox что-то завинчивает при синхронизации между устройствами, git status и git diff будет удобно, чтобы разобраться.

  • это экономит место в учетной записи Dropbox (вся история не будет храниться там)

  • это позволяет избежать проблем, поднятых @dubek и @Ates в комментариях к ответу @Dan, и проблем @clu в другой ответ.

существование удаленного где-то еще (github и др.) будет отлично работать с этим подходом.

работа в разных ветвях приносит некоторые проблемы, о которых нужно позаботиться:

  • одной из потенциальных проблем является наличие Dropbox (излишне?) синхронизация потенциально много файлов, когда один проверяет различные ветви.

  • если два или более синхронизированных устройства Dropbox имеют различные ветви проверены, не зафиксированные изменения на обоих устройствах могут быть потеряны,

один из способов обойти эти проблемы-использовать git worktree для хранения выписок из филиалов в отдельных каталогах.

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

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

чтобы избежать этой проблемы, я сделал:

  1. индекс расслоения мой Git в один файл с помощью git bundle create my_repo.git --all.
  2. установите задержку для мониторинга файлов, например, 5 минут, вместо мгновенного. Это уменьшает вероятность того, что DropBox синхронизирует частичное состояние в середине изменения. Это также очень помогает при изменении файлов на облачном диске на лету (например, с мгновенным сохранением заметок приложений).

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

для моих 2 центов Dropbox делает только sence для личного использования, где вы не хотите беспокоиться о получении Центрального хоста РЕПО. Для любого профессионального развития вы, вероятно, создадите больше проблем, чем решите, как уже упоминалось несколько раз в теме, Dropbox не предназначен для этого случая использования. Тем не менее, совершенно безопасный метод для сброса репозиториев на Dropbox без каких-либо сторонних плагинов или инструментов заключается в использовании пакетов. У меня есть следующие псевдонимы в моем .gitconfig сохранить набрав:

[alias]
        bundle-push = "!cd \"${GIT_PREFIX:-.}\" && if path=\"$(git config remote.\"\".url)\" && [ \"${path:0:1}\" = / ]; then git bundle create \"$path\" --all && git fetch \"\"; else echo \"Not a bundle remote\"; exit 1; fi #"
        bundle-fetch = "!cd \"${GIT_PREFIX:-.}\" && if path=\"$(git config remote.\"\".url)\" && [ \"${path:0:1}\" = / ]; then git bundle verify \"$path\" && git fetch \"\"; else echo \"Not a bundle remote\"; exit 1; fi #"
        bundle-new = "!cd \"${GIT_PREFIX:-.}\" && if [ -z \"${1:-}\" -o -z \"${2:-}\" ]; then echo \"Usage: git bundle-new <file> <remote name>\"; exit 1; elif [ -e \"\" ]; then echo \"File exist\"; exit 1; else git bundle create \"\" --all && git remote add -f \"\" \"$(realpath \"\")\"; fi #"

пример:

# Create bundle remote (in local repo)
$ git bundle-new dropbox ~/Dropbox/my-repo.bundle
# Fetch updates from dropbox
$ git bundle-fetch dropbox
# NOTE: writes over previous bundle. Thus, roughly equivalent to push --force --prune --all
$ git bundle-push