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 開発経験に基づいていますが、実際には何にでも適用できます。
これを行う正しい方法は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コマンドをすべて使用し続けることができます。すべて正常に機能します。
この答えはGitではなく Mercurial experienceに基づいていますが、Dropboxをこのように使うと壊れたリポジトリを求めていることになります。回(私の場合はMac、Unix、Windows)。
問題を起こす可能性があるものの完全なリストはありませんが、ここで私に気付いた具体的な例を示します。各マシンは独自の行末文字の概念と、ファイル名の大文字/小文字の扱い方を持っています。 DropboxとGit/Mercurialは、これをわずかに異なる方法で処理します(正確な違いは思い出せません)。 DropboxがGit/Mercurialの背後にある、壊れたリポジトリを更新した場合。これは即座にそして目に見えずに起こるので、あなたはそれから何かを回復しようとするまであなたのリポジトリが壊れていることさえ知らない。
このようにして1つの混乱から抜け出した後、私は次のレシピを使用して成功しましたが、問題の兆候はありません。リポジトリをDropboxから移動するだけです。それ以外にはDropboxを使ってください。ドキュメント - JARファイル リポジトリ自体を管理するには GitHub (Git)または Bitbucket (Mercurial)を使用してください。どちらも無料であるため、コストには何も追加されず、各ツールはそれぞれの長所を発揮します。
Dropbox上でGit/Mercurialを実行してもリスク以外に何も追加されません。しないでください。
すべてのプロジェクトを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
Dropboxを使っている小さなチームに関して:
各開発者が自分自身の書き込み可能なベアリポジトリをDropbox上に持っている場合、それは他の開発者にとって pull only です。これはコードの共有を容易にします。
それからあなたが一元化された「メインライン」を望むなら、あなたは一人の開発者に彼ら自身のリポジトリからそれへのすべてのプッシュを管理させることができます。
GitとDropboxを使うのが良い方法ではないと思います。両方の機能について考えてみてください。
Git:
ドロップボックス:
そして、あなたがあなたのファイルのいくつかを共有することを心配しているならば、なぜそれらを暗号化しないのですか?そして、あなたはGitへのDropboxの最大の利点を得ることができました。
それは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"
暗号化 remote バックアップ にはMercurial(またはGit)+ TrueCrypt + Dropboxを使います。
最もクールなことは、あなたがあなたのコードのごく一部を変更した場合、DropboxはTrueCryptコンテナ全体を同期しないということです。同期時間は、変更量にほぼ比例します。たとえそれが暗号化されていても、TrueCrypt + Dropboxの組み合わせはブロック暗号+ブロックレベル同期の優れた使い方をします。
第二に、モノリシック暗号化コンテナはセキュリティを強化するだけでなく、リポジトリの破損の可能性も減少させます 破損 。
注意: ただし、Dropboxの実行中はコンテナをマウントしないように気をつけてください。 2つの異なるクライアントが異なるバージョンをコンテナにチェックインすると、競合を解決するのも面倒になることがあります。そのため、チームにではなく、バックアップに使用するのは1人の人にとってのみ実用的です。
セットアップ:
preserve modification timestamp
*のチェックを外します。使用法:
P.S preserve modification timestamp
のチェックを外すと、ファイルが変更されていて同期されるべきであることをdropboxに伝えます。コンテナをマウントすると、ファイルを変更しなくてもタイムスタンプが変更されます。そうしたくない場合は、単にボリュームをread-only
としてマウントしてください。
私はMercurialを推奨する方法で使ってきました、そして特にあなたが用心深いことを強く勧めます。 Dropboxのフォーラムには、不思議なファイル名の大文字小文字の問題が自然に発生したという苦情がいっぱいです。 Hg(そして私はGitと思う)は日常的なチェックインの間気付かないし文句を言わないだろうし、あなたが本物のためにそれを使用しようとするときそれが腐敗したレポを訴えたときにだけ腐敗について聞くでしょう。悪いニュース。問題とその回避策についてもっと具体的に説明してください。私はまだ私自身でこの混乱から抜けようとしています。
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'
オープンソースプロジェクト(クロスプラットフォームの[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とマニュアルを確認してください。
共有フォルダ でこの方法(Dropboxでベアリポジトリを作成する)を使います。
少数の開発者グループは、その同期されていないリポジトリから取り出してローカルクローンを作成することができます。作業単位が完成したら、Originにプッシュバックします。
私が見逃していることの1つは、Push to Originが発生したら、変更セット情報を電子メールで送信する良い方法です。 Google Waveを使用して手動で変更を追跡しています。
Github以外のリポジトリはDropboxに保存しています。私が遭遇した1つの警告は、再インストール後に同期していました。 Dropboxは小さいファイルを最初にダウンロードしてから大きいファイルに移動します。夜に始めて週末の後に戻ってきても問題ありません:-)
私のスレッド - http://forums.dropbox.com/topic.php?id=29984&replies=6
私は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ファイルのデフォルトはスクリプトで指定されています。
今、2014年に、私は約1年半GitとDropboxを問題なく使っています。しかしいくつかの点:
git Push
はリモートリポジトリにプッシュするので、万が一破損した場合でも簡単に復旧できます。C:\Users
にmklink /D link target
でエイリアスを作成する必要がありました。私は似たような問題に直面しており、そのための小さなスクリプトを作成しました。考えはできるだけDropboxをGitと一緒に使うことです。現在、私はすぐに Ruby codeを実装しました、そしてもうすぐ追加します。
スクリプトはhttps://github.com/nuttylabs/box-git
でアクセス可能です。
私の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
もう一つのアプローチ:
最も人気のある @Dan answer を含むこれまでのすべての答えは、github、bitbucketなどのgitを中心としたサービスを使用する代わりに、Dropboxを使用して共有リポジトリを集中管理するという考えに対処します。
しかし、元の質問では "GitとDropboxを効果的に一緒に使用する"ということが実際には何を意味するのか特定していないので、別のアプローチに取り組みましょう: "Dropboxを使用してワークツリーのみを同期する"。
ハウツーはこれらのステップを持っています:
プロジェクトディレクトリ内に、空の.git
ディレクトリを作成します(例:mkdir -p myproject/.git
)
dropboxの.git
ディレクトリを同期解除します。 Dropboxアプリを使用している場合:環境設定、同期、そして「同期するフォルダの選択」を選択します。ここで、.git
ディレクトリはマークを外します。これで.git
ディレクトリが削除されます。
プロジェクトディレクトリでgit init
を実行します。
.git
が既に存在している場合にも動作します。その場合は、手順2のみを実行してください。DropboxはgitファイルのコピーをWebサイトに保存します。
ステップ2はDropboxにgitシステム構造を同期させません。これはこのアプローチの望ましい結果です。
なぜこのアプローチを使うのでしょうか。
まだプッシュされていない変更にはDropboxのバックアップがあり、それらはデバイス間で同期されます。
Dropboxがデバイス間の同期時に何か問題を起こした場合は、git status
とgit diff
が整理に役立ちます。
Dropboxアカウントのスペースを節約します(履歴全体はそこに保存されません)。
@ Danの回答に対するコメントで@dubekと@Atesが提起した懸念、および 別の回答 の@cluによる懸念を回避します。
他の場所(githubなど)にリモートが存在していても、この方法でうまくいくでしょう。
さまざまなブランチに取り組むことでいくつかの問題が発生します。
潜在的な問題の1つは、異なるブランチをチェックアウトしたときにDropboxが(不必要に?)潜在的に多数のファイルを同期させることです。
2台以上のDropboxで同期されたデバイスが異なるブランチにチェックアウトされている場合、両方のデバイスに対するコミットされていない変更は失われる可能性があります。
これらの問題を回避する一つの方法は git worktree
を使ってブランチのチェックアウトを別々のディレクトリに保存することです。
サードパーティの統合ツールを使わなくても、条件を少し高めて、DropBoxや、SpiderOak with Gitのような他の同様のクラウドディスクサービスを使うことができた。
目標は、これらのファイルの変更の途中で同期を回避することです。部分的な状態をアップロードしてからダウンロードし直し、gitの状態を完全に破壊する可能性があるためです。
この問題を避けるために、私はしました:
git bundle create my_repo.git --all
を使ってgitインデックスを一つのファイルにまとめます。それが再びgit状態を台無しにしないという保証はないので、それは完璧ではありません、しかしそれは助けとなり、そして今のところ私は何の問題も得ませんでした。