我正在创建一个git post-checkout钩子,以确保在分支之间移动时数据库状态是一致的,但是我遇到了一个特殊的问题。
为了使这一工作,我必须访问从“从”分支和从“到”分支的迁移。post-checkout钩子在索引和工作树使用" to“分支更新后运行。它所做的是:
GIT_WORK_TREE=/tmp/from-branch git checkout $from_branch -- db以获取"from“分支到/tmp/from-branch/db的db文件。GIT_WORK_TREE=/tmp/to-branch git checkout $to_branch -- db以获取" to“分支到/tmp/to-branch的db文件。/tmp/from-branch运行必要的向下迁移。除了运行之后,git显示了以下内容,其余功能都非常出色:
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
new file: db/migrations/non-prod/20180718_102122-new-one-test-data.sql
new file: db/migrations/schema/20180718_102108-new-one.sql
Changes not staged for commit:
(use "git add/rm <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
deleted: db/migrations/non-prod/20180718_102122-new-one-test-data.sql
deleted: db/migrations/schema/20180718_102108-new-one.sql这两个文件是从$from_branch签出到tmp工作树中的文件。Git似乎是在假设我正在将它们签入回购(尽管我将GIT_WORK_TREE变量设置为另一条路径),并将它们自动添加到索引中作为"staged“。我在git-checkout手册中搜索了可以防止这种情况的选项,但没有找到任何选项。
我目前最好的解决方案是在结帐后运行git reset,但这感觉就像一个黑客。只是想知道是否还有其他人能想到更好的解决方案。
发布于 2018-07-18 17:34:22
您的术语有点错误,但这在本质上是正确的:在将文件复制到工作树之前,git checkout首先将文件复制到索引中。这就是索引索引或缓存工作树的方式--因此命名为索引和缓存。(Git还使用索引的缓存信息来最小化实际完成的工作量,这样如果文件已经以正确的形式存在于工作树中,则Git不必在那里触摸它们。)
正如您注意到的,您正在使用另一种临时覆盖的工作树.那么,您需要的是另一个临时覆盖的索引。事实上,Git仅仅支持这样的观点:
TF=$(mktemp)
trap "rm -f $TF" 0 1 2 3 15 # clean up on exit
rm -f $TF # Git prefers a non-existent file to an empty one
GIT_INDEX_FILE=$TF GIT_WORK_TREE=/tmp/from-branch git checkout $from_branch -- db
rm -f $TF
GIT_INDEX_FILE=$TF GIT_WORK_TREE=/tmp/to-branch git checkout $to_branch -- db
... proceed as before注意,与每次删除临时索引不同,如果选择将/tmp/from-branch和/tmp/to-branch工作树保留为永久工作树,则可以使用两个永久索引对这两个工作树进行索引。
https://stackoverflow.com/questions/51407526
复制相似问题