回答:
DropboxのGitは素晴らしいと思います。いつも使っています。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/git/project.git
、Dropboxアカウントに関連付けた(またはこのディレクトリを他のユーザーと共有した)クローンを作成し、通常のGit操作をすべて実行すると、他のすべてのマシンに自動的に同期されます。
私のブログ記事On Version Control(old link dead)を私の推論と環境のセットアップ方法に書きました。それは私のRuby on Rails開発経験に基づいていますが、実際には何にでも適用できます。
これを行う正しい方法は、git-remote-dropboxを使用することです:https : //github.com/anishathalye/git-remote-dropbox
Dropboxで独自のベアリポジトリを作成すると、多くの問題が発生します。Anish(ライブラリの作成者)がそれを最もよく説明しています:
これらの問題の根本的な原因は、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をこのように使用すると、さまざまなマシン(Mac、 Unix、私の場合はWindows)。
うまくいかない可能性があることの完全なリストはありませんが、ここに私をかみました具体的な例があります。各マシンには、行末文字の独自の概念と、ファイル名での大文字と小文字の扱い方があります。DropboxとGit / Mercurialはこれを少し異なる方法で処理します(正確な違いを思い出しません)。DropboxがGit / Mercurialのバック、プレスト、壊れたリポジトリの背後にあるリポジトリを更新した場合。これはすぐに目に見えない形で行われるため、リポジトリを復元しようとするまで、リポジトリが壊れていることさえわかりません。
このようにして1つの混乱から掘り下げた後、私は次のレシピを使用して、大きな成功を収め、問題の兆候はありませんでした。リポジトリをDropboxから移動するだけです。それ以外はすべてDropboxを使用してください。ドキュメント、JARファイル、好きなものすべて。また、GitHub(Git)またはBitbucket(Mercurial)を使用して、リポジトリ自体を管理します。どちらも無料ですので、これはコストに何も追加されず、各ツールがその強みを発揮します。
Dropboxの上でGit / Mercurialを実行すると、リスク以外何も追加されません。しないでください。
Dropboxを使用している小さなチームに関して:
各開発者がDropboxに独自の書き込み可能なベアリポジトリを持っている場合、それは他の開発者にのみプルされ、破損のリスクなしにコード共有を容易にします!
次に、集中化された「メインライン」が必要な場合は、1人の開発者が自分のリポジトリからプッシュするすべてのプッシュを管理できます。
すべてのプロジェクトを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
GitとDropboxを使用する方法はないと思います...両方の機能について考えてみてください。
ギット:
ドロップボックス:
また、ファイルの共有に不安がある場合は、暗号化しないでください。そして、DropboxからGitへの最大の利点、つまりパブリックファイルとプライベートファイルを利用できるようになります...
現在は2015年で、3日前の時点で、Dropboxでgitを安全に使用するために、Dropbox API v2に基づく新しいツールが作成されています。デスクトップクライアントを使用するのではなくAPIに対して機能し、共有フォルダーでホストされているリポジトリへの複数の同時プッシュを正しく処理します。
設定すると、他のgitリモートとまったく同じようにgitリモートを設定できます。
git clone "dropbox::/path/to/repo"
git remote add origin "dropbox::/path/to/repo"
暗号化されたリモートバックアップにはMercurial(またはGit)+ TrueCrypt + Dropboxを使用しています。
最もクールなのは、コードの一部を変更した場合、DropboxがTrueCryptコンテナー全体を同期しないことです。同期時間は、変更量にほぼ比例します。暗号化されていても、TrueCrypt + Dropboxの組み合わせにより、ブロック暗号+ブロックレベル同期の優れた使用法が実現します。
第2に、モノリシックな暗号化されたコンテナは、セキュリティを強化するだけでなく、リポジトリの可能性を減らします 破損。
注意:ただし、Dropboxの実行中にコンテナがマウントされないように注意する必要があります。また、2つの異なるクライアントが異なるバージョンをコンテナにチェックインする場合、競合を解決するのが面倒な場合もあります。したがって、それはチームではなく、バックアップに単一の人が使用する場合にのみ実用的です。
セットアップ:
preserve modification timestamp
*のます。使用法:
PSチェックをpreserve modification timestamp
外すと、ファイルが変更され、同期する必要があることがDropboxに通知されます。コンテナーをマウントすると、コンテナー内のファイルを変更していなくても、タイムスタンプが変更されることに注意してください。そうしたくない場合は、ボリュームをread-only
ダンマクネビンの答えが大好きです。私も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'
共有フォルダーでこの方法を使用します(Dropboxでベアリポジトリを作成します)。。
少数の開発者グループは、同期されていないリポジトリからプルして、ローカルクローンを作成できます。作業単位が完了すると、元に戻ります。
私が見逃していることの1つは、オリジンへのプッシュが発生したときに、変更セット情報を電子メールで送信するための良い方法です。Google Waveを使用して、手動で変更を追跡しています。
私は推奨される方法でMercurialを使用してきました。特に、いずれかのマシンが異なる場合は注意してください。Dropboxフォーラムは、不可解なファイル名の大文字小文字の問題が自発的に発生するという苦情でいっぱいです。Hg(と私はGitと思います)は定期的なチェックイン中に気づかないか不平を言うことはありません。実際にそれを使用しようとすると、破損したリポジトリについて不平を言うときにのみ破損について聞こえます。悪いニュース。私は問題とその回避策についてより具体的になることを望みます。私はまだこの混乱から自分を掘り出そうとしています。
オープンソースプロジェクト(クロスプラットフォーム[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に保存しています。私が遭遇した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}"
スクリプトにはプロジェクト名のみが必要です。gitリポジトリを生成します~/Dropbox/git/
指定された名前で、現在のディレクトリの内容全体を新しく作成されたオリジンマスターブランチにプッシュします。複数のプロジェクト名が指定されている場合は、右端のプロジェクト名引数が使用されます。
オプションで、-rコマンド引数は、オリジンマスターにプッシュするリモートブランチを指定します。プロジェクトの起点マスターの場所は、-m引数で指定することもできます。デフォルトの.gitignoreファイルもリモートブランチディレクトリに配置されます。ディレクトリと.gitignoreファイルのデフォルトは、スクリプトで指定されます。
別のアプローチ:
これまでのすべての回答は、最も人気のある@Dan回答を含め、githubやbitbucketなどのgitに焦点を当てたサービスを使用する代わりに、Dropboxを使用して共有リポジトリを集中管理するという考えに対応しています。
ただし、元の質問では「GitとDropboxを効果的に併用する」の実際の意味が指定されていないため、「Dropboxを使用してワークツリーのみを同期する」という別のアプローチに取り組みましょう。
ハウツーには次の手順があります。
プロジェクトディレクトリ内で、一つは空の作成.git
ディレクトリ(例えばmkdir -p myproject/.git
)
.git
Dropbox のディレクトリの同期を解除します。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が(不必要に?)さまざまなブランチをチェックアウトするときに潜在的に多くのファイルを同期することです。
複数のDropbox同期デバイスで異なるブランチがチェックアウトされている場合、両方のデバイスへのコミットされていない変更が失われる可能性があります。
これらの問題を回避する1つの方法は、を使用git worktree
してブランチのチェックアウトを別のディレクトリに保持することです。
xattr -w com.dropbox.ignored 1 /path/to/somewhere
。
私の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
私は同様の問題に直面し、同じための小さなスクリプトを作成しました。アイデアは、GitでDropboxをできるだけ簡単に使用することです。現在、Rubyコードをすぐに実装しましたが、すぐに追加します。
スクリプトにはからアクセスできますhttps://github.com/nuttylabs/box-git
。
サードパーティの統合ツールを使用せずに、条件を少し強化して、DropBoxと、Gitを備えたSpiderOakなどの他の同様のクラウドディスクサービスを使用できます。
目標は、これらのファイルの変更の途中での同期を回避することです。これは、部分的な状態をアップロードしてからダウンロードし直し、git状態を完全に破壊する可能性があるためです。
この問題を回避するために、私はしました:
git bundle create my_repo.git --all
。再びgit状態を台無しにしないという保証はないので、完璧ではありませんが、それは役に立ち、今のところ問題はありませんでした。
MacOSでは、Dropboxを停止して変更を加え、Dropboxを再起動することもできます。次の組み合わせを使用しており、非常に満足しています。
両方(ローカルのgit管理プロジェクトディレクトリとDropboxにあるリモートのgitリポジトリ)で次のコマンドを実行して、自動パッキングを無効にします(これは、ドロップボックスの同期に関する主な問題です)。
git config --global gc.auto 0
その後、時々、ドロップボックスを無効にしてリポジトリを圧縮します。たとえば、アプリの新しいリリースを作成するたびに、bash-build-scriptで次のことを行います。
osascript -e "tell application \"Dropbox\" to quit"
# Compress local
git gc --prune=now; git repack -a -d
# Compress remote
REPOS_DIR_REMOTE=`git remote get-url --push origin`
cd "${REPOS_DIR_REMOTE}"
git gc --prune=now; git repack -a -d
osascript -e "tell application \"Dropbox\" to launch"
osascript -e "display notification with title \"Compress Done\""