6

我们的开发团队一直在使用 git 进行版本控制,并使用 git-annex 来存储大型二进制文件(数据二进制文件、图像、测试二进制文件等)。尽管我们已经能够设置和使用它,但我们遇到了一系列麻烦。

我们经常执行的一个给我们带来麻烦的常见行为是:

  1. 开发者 1 为一个新特性添加了一些测试,并使用 git-annex 为测试添加了相应的数据。

    git add <test-file>
    git annex add <data-file>
    git annex copy <data-file> --to=<remote location(we use s3 if that is relevant)>
    git commit -m 'Tests with data'
    git push
    git annex sync
    
  2. 审查和合并工作(我们使用 Github 进行托管并遵循分叉模型,其中所有工作由开发人员在自己的分叉上完成,并通过拉取请求合并到主存储库)

  3. 开发人员 2 获取/合并上游并尝试在他的机器上运行测试。

    git fetch upstream
    git merge upstream/<branch>
    git annex sync
    git annex get
    

我们经常会发现测试数据要么没有在 git 中被跟踪,要么无法从远程位置下载。

在我们的工作流程中使用 git-annex 的好方法是什么?

顺便说一句,还有哪些其他选项可以使这样的工作流程更好/更容易管理?

4

2 回答 2

2

好的,我们开始:

手动 git 附件 v6 使用:

服务器 1 和服务器 2:

mkdir testdata
cd testdata
git init
git annex init "LocationNameIdentifyer"
git annex upgrade
git remote add OtherServerLocationNameIdentifyer ssh://otherserver.com/thedir

当此设置准备好并且目录中没有额外文件时,您现在可以运行

git annex sync --content

如果两个位置都有文件,则在两个位置都需要做

git add --all 

在两个位置跟踪当前文件,即所谓的未锁定文件

git annex sync --content 

在两个位置上运行让我们说 3 次

所有内容都已合并,您现在可以在两个位置 cron git Annex sync --content 并且两者在工作树中都有相同的文件,如果您想跟踪放置在您执行的位置的新文件 git add not git Annex add git Annex add 将添加所谓的锁定文件的文件构成了一个完全其他的工作流程

于 2016-03-18T10:55:33.250 回答
1

这将使您拥有一个带有相关 S3 存储桶的 git 存储库“myrepo”,其中包含您的 git 存储库中您并不真正想要的所有大文件。

设置回购:

# Clone your repo "myrepo"
git clone git@github.com:me/myrepo.git
cd myrepo

# Initialize it to work with git-annex.  
# This creates .git/annex directory in the repo, 
# and a `git-annex` metadata branch the tools use behind the scenes.
git annex init                  

# The first time you use the repo with git-annex someone must link it to S3.
# Be sure to have AWS_* env vars set.
# Select a name that is fitting to be a top-level bucket name.
# This creates the bucket s3://myrepo-annexfiles-SOME_UUID.
git annex initremote myrepo-annexfiles type=S3  

# Save the repo updates related to attaching your git annex remote.
# Warning: this does a commit and push to origin of this branch plus git-annex.
# It will ALSO grab other things so make sure you have committed
# or stashed those to keep them out of the commit.
git annex sync    

在附件中添加一些文件:

# These examples are small for demo.
mkdir mybigfiles
cd mybigfiles
echo 123 > file1
echo 456 > file2

# This is the alternative to `git add`
# It replaces the files with symlinks into .git/annex/.../SOME_SHA256.
# It also does `git add` on the symlinks, but not the targets.
git annex add file*             

# Look at the symlinks with wonder.
ls -l mybigfiles/file*    

# This puts the content into S3 by SHA256 under the attached to your "special remote":
git annex move file* --to myrepo-annexfiles 

# Again, this will do a lot of committing and pushing so be prepared.
git annex sync                  

使用git-annexgit repo 将只有包含真实文件内容的 SHA256 值的死符号链接,并且该工具将关闭大文件。

后来,当其他人克隆 repo 并想要文件时:

git clone myrepo
cd myrepo

# Enable access to the S3 annex files.
# NOTE: This will put out a warning about ssh because the origin above is ssh.
# This is ONLY telling you that it can't push the big annex files there.
# In this example we are using git-annex specifically to ensure that.
# It is good that it has configured your origin to NOT participate here.
git annex enableremote myrepo-annexfiles

# Get all of the file content from S3:
git annex get mybigfiles/*

完成文件后,取回磁盘空间:

git annex drop mybigfiles/*

检查所有内容的真实位置,以及真正下载的位置:

git annex whereis mybigfiles/file*

请注意,git-annex 是一个超级灵活的工具。我发现为常见案例提炼出一个更简单的方法需要对文档进行一些研究。希望这对其他人有帮助。

于 2020-02-06T21:38:20.397 回答