20 に答える
Git on Dropbox は素晴らしいと思います。いつも使っています。私は複数のコンピューター (自宅に 2 台、職場に 1 台) を持っており、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 操作をすべて実行できます。これらの操作は、他のすべてのマシンに自動的に同期されます。
私はブログ記事「<a href="http://corrupt.net/2009/08/01/On-Version-Control/" rel="nofollow noreferrer">バージョン管理について」を書きました。私の環境設定。これは私のRuby on Rails開発経験に基づいていますが、実際には何にでも適用できます。
これを行う正しい方法は、git-remote-dropbox を使用することです: https://github.com/anishathalye/git-remote-dropbox
Dropbox で独自のベア リポジトリを作成すると、多くの問題が発生します。アニッシュ (ライブラリの作成者)はそれを最もよく説明しています:
これらの問題の根本的な原因は、Dropbox デスクトップ クライアントが Git リポジトリではなく、ファイルを同期するように設計されていることです。Git リポジトリの特別な処理がなければ、Git と同じ保証は維持されません。リモート リポジトリでの操作はアトミックではなくなり、同時操作や同期の不運なタイミングにより、リポジトリが破損する可能性があります。
従来の Git リモートはサーバー側でコードを実行してこれを適切に機能させますが、それはできません。
解決策: これを適切に解決することは可能です。Dropbox で Git を使用することは可能であり、複数のユーザーと同時操作がある場合でも、従来の Git リモートと同じ安全性と一貫性が保証されます!
ユーザーにとっては、Git と Dropbox の間の透明な双方向ブリッジとして機能し、従来の Git リモートのすべての保証を維持する Git リモート ヘルパーである git-remote-dropbox を使用するのと同じくらい簡単です。共有フォルダーを使用しても安全なので、共同作業に使用できます (無制限の共同作業者と無制限のプライベート リポジトリを使用できます!)。
リモート ヘルパーを使用すると、Dropbox を Git リモートとして使用し、引き続き git clone、git pull、git push などの通常の Git コマンドをすべて使用でき、すべてが期待どおりに機能します。
この回答は、Git ではなくMercurialの経験に基づいていますが、この経験によると、Dropbox をこのように使用すると、同じ Dropbox ベースのリポジトリをさまざまな時間に異なるマシン (Mac、 Unix、私の場合は Windows)。
うまくいかない可能性のあるものの完全なリストはありませんが、ここに私を悩ませた具体的な例を示します。各マシンには、行末文字の独自の概念と、ファイル名での大文字/小文字の処理方法があります。Dropbox と Git/Mercurial では、この処理が少し異なります (正確な違いは覚えていません)。Dropbox が Git/Mercurial の背後にあるリポジトリを更新すると、壊れたリポジトリになります。これは即座に目に見えない形で行われるため、リポジトリから何かを復元しようとするまで、リポジトリが壊れていることさえわかりません。
このようにして 1 つの混乱から掘り起こした後、私は次のレシピを使用して大成功を収め、問題の兆候はありませんでした. リポジトリを Dropbox から移動するだけです。それ以外はすべて Dropbox を使用してください。ドキュメント、JAR ファイル、何でもどうぞ。また、GitHub (Git) またはBitbucket (Mercurial) を使用して、リポジトリ自体を管理します。どちらも無料であるため、コストがかからず、各ツールがそれぞれの強みを発揮するようになりました.
Dropbox の上で Git/Mercurial を実行しても、リスク以外は何も追加されません。やらないでください。
すべてのプロジェクトを1つのGitリポジトリに配置したくなかったし、プロジェクトごとにこのコードを実行したくなかったので、プロセスを自動化する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
Dropbox を使用する小規模なチームに関して:
各開発者が Dropbox に独自の書き込み可能なベア リポジトリを持っていて、他の開発者にのみプルできる場合、これにより破損のリスクなしにコード共有が容易になります!
次に、集中型の「メインライン」が必要な場合は、1 人の開発者が自分のレポからすべてのプッシュを管理できます。
Git と Dropbox を使用するのがよい方法だとは思いません... 両方の機能について考えてみてください。
ギット:
- 中央リポジトリを持つことができます
- 独自の変更を加えた独自のリポジトリを持つことができます
- 中央リポジトリから変更を送受信できます
- 複数の人が同じファイルを変更することを許可し、それらがそれらをマージするか、それができない場合はそれらをマージするように求めます
- 中央リポジトリへのアクセスを許可する Web クライアントとデスクトップ クライアントがあります。
ドロップボックス:
- すべてを中央リポジトリに保持
- サーバー内に独自のバージョンのファイルを持つことができます
- 中央リポジトリからの変更の送受信を強制します
- 複数の人が同じファイルを変更すると、最初にコミットされたファイルが後のコミットに置き換えられ、面倒なマージが行われなくなります (そして間違いなく最大の欠点です)。
- 中央リポジトリへのアクセスを許可する Web クライアントとデスクトップ クライアントがあります。
また、ファイルの一部を共有することに不安がある場合は、ファイルを暗号化してみませんか? そして、Git に対する Dropbox の最大の利点、つまり、公開ファイルと非公開ファイルを持つことができます...
共有フォルダーでこの方法 (Dropbox にベア リポジトリを作成する) を使用します。
少数の開発者グループは、同期されたリポジトリからプルして、ローカル クローンを作成できます。作業単位が完了したら、原点に戻ります。
私が見逃していることの 1 つは、オリジンへのプッシュが発生したときに変更セット情報を電子メールで送信する良い方法です。Google Wave を使用して手動で変更を追跡しています。
ダン・マクネビンの答えが大好きです!私も現在、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'
また、オープン ソース プロジェクト (クロス プラットフォーム [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 とマニュアルを確認してください。
私は推奨される方法で Mercurial を使用してきましたが、特にマシンのいずれかが異なる場合は注意してください。Dropbox のフォーラムには、ファイル名の大文字と小文字の区別に関する不思議な問題が自然発生したという苦情でいっぱいです。Hg (そして Git だと思います) は定期的なチェックイン中に気付かなかったり文句を言ったりすることはありません。悪いニュース。問題とその回避策について、より具体的に教えていただければ幸いです。私はまだこの混乱から抜け出そうとしています。
Github以外のリポジトリをDropboxに保存します。私が遭遇した1つの注意点は、再インストール後の同期でした。Dropboxは、大きいファイルに移動する前に、最初に小さいファイルをダウンロードします。夜に始めて週末の後に戻ってきても問題ありません:-)
私のスレッド-http://forums.dropbox.com/topic.php?id= 29984&replies =6
私は同様の問題に直面し、同じための小さなスクリプトを作成しました。アイデアは、GitでDropboxをできるだけ簡単に使用することです。現在、 Rubyコードをすばやく実装しましたが、間もなく追加する予定です。
スクリプトには、からアクセスできますhttps://github.com/nuttylabs/box-git
。
サードパーティの統合ツールを使用しなくても、条件を少し強化して、DropBox や、Git で SpiderOak などの他の同様のクラウド ディスク サービスを使用することができました。
目標は、これらのファイルの変更の途中で同期を回避することです。これは、部分的な状態をアップロードしてからダウンロードし直し、git の状態を完全に破壊する可能性があるためです。
この問題を回避するために、次のことを行いました。
- を使用して、私の git インデックスを 1 つのファイルにバンドルします
git bundle create my_repo.git --all
。 - 瞬時ではなく、ファイル監視の遅延を設定します (例: 5 分)。これにより、DropBox が変更の途中で部分的な状態を同期する可能性が低くなります。また、クラウド ディスク上のファイルをオンザフライで変更する場合にも非常に役立ちます (メモを取るアプリケーションを瞬時に保存する場合など)。
gitの状態が再び台無しにならないという保証はないため、完璧ではありませんが、助けになり、今のところ問題はありませんでした。