web-dev-qa-db-ja.com

GitとDropboxを一緒に効果的に使うには?

Git および Dropbox を効果的に併用するにはどうすればよいですか。

1102
n1kh1lp

Git on Dropboxは素晴らしいと思います。私はいつもそれを使っています。私はDropboxを中央の裸のリポジトリとして使う複数のコンピュータ(自宅に2台、仕事に1台)を持っています。私は公共サービスでそれをホストしたくないし、私がいつでも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アカウントに関連付けた(あるいはこのディレクトリを人々と共有した)~/Dropbox/git/project.gitをクローンするだけで、あなたはすべての通常のGit操作をすることができ、それらは他のすべてのマシンに自動的に同期されます。

私はブログ記事を書いた、バージョン管理について、( 古いリンク デッド私の推論と私が自分の環境をどのように設定したかについては、私の Ruby on Rails 開発経験に基づいていますが、実際には何にでも適用できます。

1369
Dan McNevin

これを行う正しい方法はgit-remote-dropboxを使うことです: https://github.com/anishathalye/git-remote-dropbox

Dropboxであなた自身の裸のリポジトリを作成することは多くの問題を引き起こします。アニッシュ(図書館の創作者) それが一番よく説明しています

これらの問題の根本的な原因は、DropboxデスクトップクライアントがGitリポジトリではなくファイルを同期するように設計されていることです。 Gitリポジトリに対する特別な処理がないと、Gitと同じ保証は維持されません。リモートリポジトリでの操作はアトミックではなくなり、同時操作や同期の悪いタイミングでリポジトリが破損する可能性があります。

従来のGitリモートは、これを正しく機能させるためにサーバー側でコードを実行しますが、それはできません。

解決策:これを正しく解決することは可能です。 GitをDropboxと一緒に使用して、複数のユーザーと同時操作がある場合でも、従来のGitリモコンと同じ安全性と一貫性を保証することが可能です。

ユーザーにとっては、GitとDropboxの間の透過的な双方向ブリッジとして機能し、従来のGitリモートのすべての保証を維持するgit-remote-dropboxを使用するのと同じくらい簡単です。共有フォルダと一緒に使用しても安全なので、コラボレーションに使用できます(無制限の共同制作者を含む無制限のプライベートリポジトリ)。

リモートヘルパーを使用すると、DropboxをGitリモートとして使用し、git clone、git pull、git Pushなどの通常のGitコマンドをすべて使用し続けることができます。すべて正常に機能します。

111
clu

この答えはGitではなく Mercurial experienceに基づいていますが、Dropboxをこのように使うと壊れたリポジトリを求めていることになります。回(私の場合はMac、Unix、Windows)。

問題を起こす可能性があるものの完全なリストはありませんが、ここで私に気付いた具体的な例を示します。各マシンは独自の行末文字の概念と、ファイル名の大文字/小文字の扱い方を持っています。 DropboxとGit/Mercurialは、これをわずかに異なる方法で処理します(正確な違いは思い出せません)。 DropboxがGit/Mercurialの背後にある、壊れたリポジトリを更新した場合。これは即座にそして目に見えずに起こるので、あなたはそれから何かを回復しようとするまであなたのリポジトリが壊れていることさえ知らない。

このようにして1つの混乱から抜け出した後、私は次のレシピを使用して成功しましたが、問題の兆候はありません。リポジトリをDropboxから移動するだけです。それ以外にはDropboxを使ってください。ドキュメント - JARファイル リポジトリ自体を管理するには GitHub (Git)または Bitbucket (Mercurial)を使用してください。どちらも無料であるため、コストには何も追加されず、各ツールはそれぞれの長所を発揮します。

Dropbox上でGit/Mercurialを実行してもリスク以外に何も追加されません。しないでください。

87
Bradjcox

すべてのプロジェクトを1つのGitリポジトリにまとめたくないし、またこのコードを1つのプロジェクトごとに実行したくもないので、プロセスを自動化する Bash スクリプトを作成しました。 1つまたは複数のディレクトリでそれを使用することができます - それでそれはあなたのためにこの記事のコードをすることができるかそれは一度に複数のプロジェクトでそれをすることができます。

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

Dropboxを使っている小さなチームに関して:

各開発者が自分自身の書き込み可能なベアリポジトリをDropbox上に持っている場合、それは他の開発者にとって pull only です。これはコードの共有を容易にします。

それからあなたが一元化された「メインライン」を望むなら、あなたは一人の開発者に彼ら自身のリポジトリからそれへのすべてのプッシュを管理させることができます。

16
teh_senaus

GitとDropboxを使うのが良い方法ではないと思います。両方の機能について考えてみてください。

Git:

  • 中央リポジトリを持つことができます
  • 自分の変更を加えた自分のリポジトリを持つことができます
  • セントラルリポジトリとの間で変更を送受信できるようにします。
  • 複数の人が同じファイルを変更することを許可し、彼らはそれらをマージするか、それができない場合はそれらをマージするように頼みます
  • Webおよびデスクトップクライアントに中央リポジトリへのアクセスを許可する

ドロップボックス:

  • すべてを中央リポジトリに保管
  • あなたはあなた自身のバージョンのファイルをサーバーに持つことができます
  • 中央リポジトリから変更を送受信するように強制します。
  • 複数の人が同じファイルを変更した場合、最初にコミットされたファイルは後のコミットに置き換えられ、面倒なマージは発生しません(そして間違いなくその最大の欠点)。
  • Webおよびデスクトップクライアントに中央リポジトリへのアクセスを許可する。

そして、あなたがあなたのファイルのいくつかを共有することを心配しているならば、なぜそれらを暗号化しないのですか?そして、あなたはGitへのDropboxの最大の利点を得ることができました。

15
Coyote21

それは2015年になりました、そして3日前の時点で、Dropboxで安全にgitを使うために Dropbox API v2 に基づいた 新しいツール が作られました。デスクトップクライアントを使用するのではなくAPIに対して機能し、共有フォルダでホストされているリポジトリへの複数の同時プッシュを正しく処理します。

一度設定すると、他のGit Remoteとまったく同じようにGit Remoteを設定できるようになります。

git clone "dropbox::/path/to/repo"
git remote add Origin "dropbox::/path/to/repo"
15
merlin2011

暗号化 remote バックアップ にはMercurial(またはGit)+ TrueCrypt + Dropboxを使います。

最もクールなことは、あなたがあなたのコードのごく一部を変更した場合、DropboxはTrueCryptコンテナ全体を同期しないということです。同期時間は、変更量にほぼ比例します。たとえそれが暗号化されていても、TrueCrypt + Dropboxの組み合わせはブロック暗号+ブロックレベル同期の優れた使い方をします。

第二に、モノリシック暗号化コンテナはセキュリティを強化するだけでなく、リポジトリの破損の可能性も減少させます 破損

注意: ただし、Dropboxの実行中はコンテナをマウントしないように気をつけてください。 2つの異なるクライアントが異なるバージョンをコンテナにチェックインすると、競合を解決するのも面倒になることがあります。そのため、チームにではなく、バックアップに使用するのは1人の人にとってのみ実用的です。

セットアップ:

  • Truecryptコンテナを作成します(複数ギガバイトで結構です)。
  • Truecryptの設定で、preserve modification timestamp *のチェックを外します。
  • Dan( https://stackoverflow.com/a/1961515/781695 )の説明に従って、リポジトリを作成します。

使用法:

  • Dropboxを終了
  • コンテナをマウントし、変更をプッシュし、アンマウントする
  • ドロップボックスを実行

P.S preserve modification timestampのチェックを外すと、ファイルが変更されていて同期されるべきであることをdropboxに伝えます。コンテナをマウントすると、ファイルを変更しなくてもタイムスタンプが変更されます。そうしたくない場合は、単にボリュームをread-onlyとしてマウントしてください。

9
user

私はMercurialを推奨する方法で使ってきました、そして特にあなたが用心深いことを強く勧めます。 Dropboxのフォーラムには、不思議なファイル名の大文字小文字の問題が自然に発生したという苦情がいっぱいです。 Hg(そして私はGitと思う)は日常的なチェックインの間気付かないし文句を言わないだろうし、あなたが本物のためにそれを使用しようとするときそれが腐敗したレポを訴えたときにだけ腐敗について聞くでしょう。悪いニュース。問題とその回避策についてもっと具体的に説明してください。私はまだ私自身でこの混乱から抜けようとしています。

6
Brad Cox

Dan McNevinによる答えが大好きです!私は今も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'
6
Michiel de Mare

オープンソースプロジェクト(クロスプラットフォームの[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とマニュアルを確認してください。

5

共有フォルダ でこの方法(Dropboxでベアリポジトリを作成する)を使います。

少数の開発者グループは、その同期されていないリポジトリから取り出してローカルクローンを作成することができます。作業単位が完成したら、Originにプッシュバックします。

私が見逃していることの1つは、Push to Originが発生したら、変更セット情報を電子メールで送信する良い方法です。 Google Waveを使用して手動で変更を追跡しています。

5
dengel

Github以外のリポジトリはDropboxに保存しています。私が遭遇した1つの警告は、再インストール後に同期していました。 Dropboxは小さいファイルを最初にダウンロードしてから大きいファイルに移動します。夜に始めて週末の後に戻ってきても問題ありません:-)

私のスレッド - http://forums.dropbox.com/topic.php?id=29984&replies=6

4
Ben

私はDan McNevinによるトップ投票の答えが好きです。私はgitコマンドのシーケンスを何度もやり過ぎることになり、スクリプトを作成することにしました。だからここにあります:

#!/bin/bash

# Usage
usage() {
    echo "Usage: ${0} -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 "${1}" in
        '-h' | '--help' ) usage ;;
        '-m' )
            shift
            masterdir="${1}"
            ;;
        '-r' )
            shift
            remotedir="${1}"
            ;;
        * )
            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}"

スクリプトに必要なのはプロジェクト名だけです。指定された名前で~/Dropbox/git/にgitリポジトリを生成し、現在のディレクトリの内容全体を新しく作成されたOriginマスターブランチにプッシュします。複数のプロジェクト名が指定されている場合は、一番右のプロジェクト名引数が使用されます。

オプションで、-rコマンド引数はOriginのマスタにプッシュするリモートブランチを指定します。プロジェクトのOriginのマスターの場所は、-m引数で指定することもできます。デフォルトの.gitignoreファイルもリモートブランチディレクトリに置かれます。ディレクトリと.gitignoreファイルのデフォルトはスクリプトで指定されています。

3
ChisholmKyle

今、2014年に、私は約1年半GitとDropboxを問題なく使っています。しかしいくつかの点:

  • Dropboxを使っている私のすべてのマシンはWindows上にあり、異なるバージョン(7から8)と1つのMacです。
  • 私はそのリポジトリを他の誰かと共有しないので、それを修正するのは私だけです。
  • git Pushはリモートリポジトリにプッシュするので、万が一破損した場合でも簡単に復旧できます。
  • 一部のライブラリは絶対位置を指すため、C:\Usersmklink /D link targetでエイリアスを作成する必要がありました。
3
Mikaël Mayer

私は似たような問題に直面しており、そのための小さなスクリプトを作成しました。考えはできるだけDropboxをGitと一緒に使うことです。現在、私はすぐに Ruby codeを実装しました、そしてもうすぐ追加します。

スクリプトはhttps://github.com/nuttylabs/box-gitでアクセス可能です。

2
Kiran Madipally

私の2セントの場合Dropboxはあなたが個人的な使用のために意味を成すのはあなたが中心的なリポジトリホストを得ることを煩わしたくない場合だけです。すでにスレッドで数回言及されているように、Dropboxはこのユースケース向けには設計されていません。そうは言っても、サードパーティのプラグインやツールを使用せずにDropboxのリポジトリをダンプするための完全に安全な方法はバンドルを使用することです。 .gitconfigには、入力を節約するために次のエイリアスがあります。

[alias]
        bundle-Push = "!cd \"${GIT_PREFIX:-.}\" && if path=\"$(git config remote.\"$1\".url)\" && [ \"${path:0:1}\" = / ]; then git bundle create \"$path\" --all && git fetch \"$1\"; else echo \"Not a bundle remote\"; exit 1; fi #"
        bundle-fetch = "!cd \"${GIT_PREFIX:-.}\" && if path=\"$(git config remote.\"$1\".url)\" && [ \"${path:0:1}\" = / ]; then git bundle verify \"$path\" && git fetch \"$1\"; 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 \"$2\" ]; then echo \"File exist\"; exit 1; else git bundle create \"$2\" --all && git remote add -f \"$1\" \"$(realpath \"$2\")\"; 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
2
Niklas Holm

もう一つのアプローチ:

最も人気のある @Dan answer を含むこれまでのすべての答えは、github、bitbucketなどのgitを中心としたサービスを使用する代わりに、Dropboxを使用して共有リポジトリを集中管理するという考えに対処します。

しかし、元の質問では "GitとDropboxを効果的に一緒に使用する"ということが実際には何を意味するのか特定していないので、別のアプローチに取り組みましょう: "Dropboxを使用してワークツリーのみを同期する"。

ハウツーはこれらのステップを持っています:

  1. プロジェクトディレクトリ内に、空の.gitディレクトリを作成します(例:mkdir -p myproject/.git

  2. dropboxの.gitディレクトリを同期解除します。 Dropboxアプリを使用している場合:環境設定、同期、そして「同期するフォルダの選択」を選択します。ここで、.gitディレクトリはマークを外します。これで.gitディレクトリが削除されます。

  3. プロジェクトディレクトリでgit initを実行します。

.gitが既に存在している場合にも動作します。その場合は、手順2のみを実行してください。DropboxはgitファイルのコピーをWebサイトに保存します。

ステップ2はDropboxにgitシステム構造を同期させません。これはこのアプローチの望ましい結果です。

なぜこのアプローチを使うのでしょうか。

  • まだプッシュされていない変更にはDropboxのバックアップがあり、それらはデバイス間で同期されます。

  • Dropboxがデバイス間の同期時に何か問題を起こした場合は、git statusgit diffが整理に役立ちます。

  • Dropboxアカウントのスペースを節約します(履歴全体はそこに保存されません)。

  • @ Danの回答に対するコメントで@dubekと@Atesが提起した懸念、および 別の回答 の@cluによる懸念を回避します。

他の場所(githubなど)にリモートが存在していても、この方法でうまくいくでしょう。

さまざまなブランチに取り組むことでいくつかの問題が発生します。

  • 潜在的な問題の1つは、異なるブランチをチェックアウトしたときにDropboxが(不必要に?)潜在的に多数のファイルを同期させることです。

  • 2台以上のDropboxで同期されたデバイスが異なるブランチにチェックアウトされている場合、両方のデバイスに対するコミットされていない変更は失われる可能性があります。

これらの問題を回避する一つの方法は git worktree を使ってブランチのチェックアウトを別々のディレクトリに保存することです。

1
IBrum

サードパーティの統合ツールを使わなくても、条件を少し高めて、DropBoxや、SpiderOak with Gitのような他の同様のクラウドディスクサービスを使うことができた。

目標は、これらのファイルの変更の途中で同期を回避することです。部分的な状態をアップロードしてからダウンロードし直し、gitの状態を完全に破壊する可能性があるためです。

この問題を避けるために、私はしました:

  1. git bundle create my_repo.git --allを使ってgitインデックスを一つのファイルにまとめます。
  2. ファイル監視の遅延を瞬間的ではなく5分などに設定します。これにより、DropBoxが変更の途中で部分的な状態を同期する可能性が低くなります。クラウドディスク上のファイルをオンザフライで変更する場合(瞬時にメモを取るアプリケーションなど)にも非常に役立ちます。

それが再びgit状態を台無しにしないという保証はないので、それは完璧ではありません、しかしそれは助けとなり、そして今のところ私は何の問題も得ませんでした。

0
gaborous