답변:
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 )을 작성했습니다. 루비 온 레일즈 개발 경험을 기반으로 하지만 실제로는 무엇이든 적용 할 수 있습니다.
이를 수행하는 올바른 방법은 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를 사용하면 여러 시간에 다른 컴퓨터에서 동일한 Dropbox 기반 저장소를 업데이트 할 가능성이있는 경우 손상된 저장소를 요구한다고합니다 (Mac, 유닉스, 내 경우에는 Windows).
나는 잘못 될 수있는 것들의 전체 목록을 가지고 있지는 않지만 여기에 나에게 맞는 구체적인 예가 있습니다. 각 기계에는 고유 한 줄 끝 문자 개념과 파일 이름에서 대문자 / 소문자를 처리하는 방법이 있습니다. Dropbox와 Git / Mercurial은 이것을 약간 다르게 처리합니다 (정확한 차이점은 기억 나지 않습니다). Dropbox가 Git / Mercurial의 저장소, 손상된 저장소 뒤에있는 저장소를 업데이트하면 손상됩니다. 이것은 즉각적으로 보이지 않게 발생하므로 저장소에서 무언가를 복구하려고 할 때까지 저장소가 손상되었다는 것을조차 알지 못합니다.
이런 식으로 일을하는 한 엉망에서 파낸 후, 나는 큰 성공과 문제의 흔적없이 다음과 같은 레시피를 사용했습니다. Dropbox에서 리포지토리를 옮기기 만하면됩니다. 다른 모든 작업에는 Dropbox를 사용하십시오. 설명서, JAR 파일 등 원하는 내용이 있습니다. 그리고 GitHub (Git) 또는 Bitbucket (Mercurial)을 사용하여 리포지토리 자체를 관리하십시오. 둘 다 무료이므로 비용에 아무런 영향을 미치지 않으며 이제 각 도구의 장점이 있습니다.
Dropbox 위에서 Git / Mercurial을 실행하면 위험 외에는 아무것도 추가되지 않습니다. 하지마
Dropbox를 사용하는 소규모 팀과 관련하여 :
각 개발자가 다른 개발자 에게만 제공 되는 Dropbox에 자체 쓰기 가능한 베어 리포지토리 가있는 경우 손상 위험없이 코드를 공유 할 수 있습니다!
그런 다음 중앙 집중식 '기본'을 원하면 한 개발자가 자신의 리포지토리에서 모든 푸시를 관리하도록 할 수 있습니다.
모든 프로젝트를 하나의 Git 저장소에 배치하고 싶지 않았고 모든 단일 프로젝트에 대해이 코드를 실행하고 싶지 않았으므로 프로세스를 자동화 하는 Bash 스크립트를 만들었습니다 . 하나 이상의 디렉토리에서 사용할 수 있으므로이 게시물의 코드를 사용하거나 여러 프로젝트에서 한 번에 수행 할 수 있습니다.
#!/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 remote와 똑같이 git remote를 설정할 수 있습니다.
git clone "dropbox::/path/to/repo"
git remote add origin "dropbox::/path/to/repo"
암호화 된 원격 백업을 위해 Mercurial (또는 Git) + TrueCrypt + Dropbox를 사용 합니다.
가장 멋진 점은 코드의 작은 부분을 수정하면 Dropbox가 전체 TrueCrypt 컨테이너를 동기화하지 않는다는 것입니다. 동기화 시간은 변경 량에 대략 비례합니다. 암호화되어 있지만 TrueCrypt + Dropbox의 조합은 블록 암호 + 블록 수준 동기화를 훌륭하게 사용합니다.
둘째, 모 놀리 식 암호화 컨테이너는 보안을 강화할뿐만 아니라 리포지토리 손상 가능성을 줄 입니다.
주의 : 그러나 Dropbox가 실행되는 동안 컨테이너를 마운트하지 않도록주의해야합니다. 두 명의 서로 다른 클라이언트가 다른 버전을 컨테이너에 체크인하면 충돌을 해결하기가 어려울 수도 있습니다. 따라서 팀이 아닌 백업을 위해 한 사람 만 사용하는 것이 실용적입니다.
설정:
preserve modification timestamp
*를 선택 취소하십시오 .용법:
PS 체크 preserve modification timestamp
박스를 해제하면 파일이 수정되었고 동기화되어야 함을 dropbox 에 알립니다. 컨테이너를 마운트하면 파일을 변경하지 않아도 타임 스탬프가 수정됩니다. 그렇게하지 않으려면 볼륨을 다음과 같이 마운트하십시오.read-only
나는 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'
공유 폴더 에서이 방법 (Dropbox에서 베어 리포지토리 생성)을 사용 합니다 .
소규모 개발자 그룹이 베어 동기화 저장소에서 가져와 로컬 클론을 생성 할 수 있습니다. 작업 단위가 완료되면 원점으로 돌아갑니다.
내가 놓친 것 중 하나는 원점으로 푸시가 발생하면 변경 세트 정보와 함께 전자 메일을 보내는 좋은 방법입니다. Google Wave를 사용하여 변경 사항을 수동으로 추적하고 있습니다.
나는 Mercurial을 권장 된 방식으로 사용하고 있으며 특히 기계가 다른 경우 조심해야합니다. Dropbox fora는 자발적으로 나타나는 신비한 파일 이름 사례 문제에 대한 불만으로 가득합니다. Hg (그리고 Git을 추측합니다)는 일상적인 체크인 중에 통지하거나 불평하지 않으며 실제 사용하려고 할 때 손상된 저장소에 대해 불평 할 때만 손상에 대해 듣게됩니다. 나쁜 소식. 문제와 해결 방법에 대해 더 구체적으로 설명해주십시오. 나는 아직도이 엉망으로부터 스스로를 파 내려고 노력하고있다.
소수의 (3-4) 명령으로 리포지토리 관리의 모든 세부 사항을 수행하는 오픈 소스 프로젝트 (크로스 플랫폼 [Linux, Mac, Win] 스크립트 모음)도 있습니다.
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
전체 명령 참조 및 학습서에 대해서는 프로젝트 위키 및 매뉴얼을 확인하십시오.
Github 이외의 저장소를 Dropbox에 저장합니다. 내가 만난 한 가지주의 사항은 재설치 후 동기화하는 것이 었습니다. Dropbox는 가장 큰 파일로 이동하기 전에 가장 작은 파일을 먼저 다운로드합니다. 밤에 시작하여 주말 후에 다시 돌아 오면 문제가되지 않습니다 :-)
내 스레드 -http : //forums.dropbox.com/topic.php ? id=29984&replies=6
이제 2014 년에 Git and Dropbox를 약 1 년 반 동안 문제없이 사용했습니다. 그래도 몇 가지 사항 :
git push
원격 저장소로 푸시되어 손상되면 쉽게 복구 할 수 있습니다.C:\Users
과 mklink /D link target
일부 라이브러리는 절대 위치로 지적되었다 때문이다.나는 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를 효과적으로 함께 사용하는 것"의 의미가 구체적으로 명시되어 있지 않기 때문에 "droptree를 사용하여 작업 트리 만 동기화"라는 또 다른 접근법을 시도해 봅시다.
방법에는 다음 단계가 있습니다.
프로젝트 디렉토리 내에서, 하나는 빈 생성 .git
(예 : 디렉토리 mkdir -p myproject/.git
)
.git
Dropbox 에서 디렉토리를 동기화 해제하십시오 . Dropbox 앱을 사용하는 경우 : 환경 설정, 동기화 및 "동기화 할 폴더 선택"으로 이동하여 .git
디렉토리를 표시 해제해야합니다. .git
디렉토리 가 제거됩니다 .
git init
프로젝트 디렉토리에서 실행
.git
이미 존재하는 경우에도 작동합니다. 2 단계 만 수행하십시오. Dropbox는 웹 사이트에 git 파일의 사본을 보관합니다.
2 단계에서는 Dropbox가 git 시스템 구조를 동기화하지 않도록하는데, 이는이 접근 방식의 바람직한 결과입니다.
왜이 방법을 사용합니까?
아직 푸시되지 않은 변경 사항은 Dropbox 백업을 가지며 장치간에 동기화됩니다.
경우 보관 용 나사 일까지에서 장치 간 동기화, 때 git status
와 git diff
물건을 분류하기 편리 할 것입니다.
Dropbox 계정의 공간을 절약합니다 (전체 기록이 저장되지 않음)
@Dan의 답변에 대한 의견에서 @dubek 및 @Ates가 제기 한 문제와 다른 답변 에서 @clu의 문제를 피 합니다.
다른 곳 (github 등)에 리모컨이 있으면이 방법으로 잘 작동합니다.
다른 지점에서 작업하면 다음과 같은 문제를 해결해야합니다.
잠재적 인 문제 중 하나는 다른 분기를 체크 아웃 할 때 Dropbox (불필요하게?)가 잠재적으로 많은 파일을 동기화하는 것입니다.
두 개 이상의 Dropbox 동기화 기기에 서로 다른 분기가 체크 아웃되어 있으면 두 기기에 대한 커밋되지 않은 변경 사항이 손실 될 수 있습니다.
이러한 문제를 해결하는 한 가지 방법은 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 및 SpiderOak with Git과 같은 다른 유사한 클라우드 디스크 서비스를 사용할 수 있습니다.
목표는 이러한 파일 수정 중에 동기화를 피하는 것입니다. 부분 상태를 업로드 한 다음 다시 다운로드하여 git 상태를 완전히 손상시킬 수 있기 때문입니다.
이 문제를 피하기 위해 다음과 같이했습니다.
git bundle create my_repo.git --all
.그것은 git 상태를 다시 엉망으로 만들지 않을 것이라는 보장이 없으므로 완벽하지는 않지만 도움이되며 현재 아무런 문제가 발생하지 않았습니다.
MacOS에서는 Dropbox를 중지하고 변경 한 다음 Dropbox를 다시 시작하면됩니다. 다음 조합을 사용하고 있으며 매우 만족합니다.
로컬 git 관리 프로젝트 디렉토리와 Dropbox에있는 원격 git 저장소 모두에서 자동 압축을 비활성화하려면 다음 명령을 실행하십시오 (dropbox 동기화의 주요 문제점).
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\""