2012-11-19 30 views
2

我已启用$Id:$通过ident.gitattributes文件扩展。这使我可以在别人检出我的存储库并从那里安装它时快速识别文件是否过期。更新登录后的ident字符串

现在,我还将我自己的Git存储库的内容同步到其他(非开发,即无Git)系统。问题在于关键字扩展只发生在结帐,但我的工作流程是commit - > push - > sync,所以同步副本包含过时的ID。

如何在本地提交后轻松强制更新Ids? (积分为之后的任何承诺自动做这个!)

简单git checkout不工作(也不能与--force),可能是因为该文件的内容并没有改变。 git checkout-index --force也没有。我只设法通过无论是本地的修改来完成这个(繁琐,需要知道修改后的文件):

$ echo "modified" >> file 
$ git checkout file 

或临时检查出以前的承诺:

$ git checkout HEAD^ 
$ git checkout [email protected]{1} 
+0

你申请什么filepattern此的ident属性?以及包含多少个文件? –

+1

另外,一个提示(虽然这不能回答你的问题):你可以做'git checkout HEAD @ {1}',它会检出HEAD的前一个值(http://git-scm.com/book/ EN /针对Git工具版本选择#引用日志 - 简短名字)。它跟踪分支值在.git/logs –

+1

我会建议在检出文件时不要使用idents。它几乎从来都不是正确的解决方案,并导致比解决问题更多的问题;相反,如果您需要跟踪哪个修订版与结帐相对应,那么我会使用一个单独的文件来跟踪该文件,并且不会将其提交给git。例如,如果你有一个'sync'脚本,让它将当前的commit-id写入一个文件,然后在需要显示的地方读取该文件。 –

回答

0

这可以通过post-commit挂钩完成。我已经通过脚本自动安装,维护我的git-extensions repository的一部分:

$ git-ident-update --help 
Update the expansion of $Id$ to $Id:...$ via ident in the .gitattributes 
after a commit. 
To do this automatically in the future, invoke with --install. 
Usage: git-ident-update [--install|--uninstall|--status|--set [<path>[ <path> ...]]] [-?|-h|--help] 
1

这里有一些建议:

git checkout --force .也许git checkout --force file.txt

如果这些命令中的一个工作,那么你可以创建一个脚本.git/hooks/post-commit并且该脚本是一个调用该命令(或任何命令有效)的单线程,然后git会在每次提交时执行该操作。我相信钩子脚本会自动将工作直接的根目录(.git文件夹所在的位置)设置为脚本的cwd。

编辑:

如果你运行touch file.txt; git checkout file.txt Git会做一个全面的检出,包括应用的ident属性,当我测试了一下。希望可以以某种方式使用

+0

不幸的是,'--force'没有帮助。但感谢钩的细节;我会尝试。 –

+0

根据我对您的一般要求的理解,我会在这个问题的评论中尝试Brian的建议。但是,我不确定我是否知道“同步”回购协议的含义。你的意思是你做了'git pull'吗?或者你有其他系统将文件复制/ rsync到其他非git实例?对不起,没有完全理解;尽管也许这并不重要。 –

+0

我通过Unison工具同步脚本(xcopy/rsync也可以)。我意识到ident的局限性,并且通常推荐使用它,但它似乎非常适合我的用例。 –