避免/解决git stash/rebase改变文件时间戳的方法

4
我的问题是,更改时间戳会导致构建时间比实际需要的时间更长,这取决于我本地修改的文件。这很麻烦,因为我们的远程服务器每隔约10分钟就会接收到新的更改,我不得不在推送更改之前进行验证,或者一遍又一遍地获取并构建。不确定我哪种方法更不喜欢。
我想这不是git本身应该处理的事情,但也许有一个工具或脚本可以使用,例如在rebase之前对文件样本进行校验和时间戳,在还原时为内容未更改的文件恢复时间戳?

"推送我的更改而不进行验证,或者重新获取并构建"。看起来你正在做一些错误的事情。要么你的分支已经是最新的了,你可以直接推送它,要么它落后了,你必须重新基于它并重建(也许不是所有的东西都需要)。你知道如何使用 git push 指定要推送哪些分支吗?你能写一些关于你的设置的更多信息吗?听起来你正在工作的分支每10分钟就会更新,这似乎不太可能。" - Frax
很遗憾,我们的代码库工作并没有很好地组织起来,这是我几乎无法改变的。此外,我不介意进行部分构建,但如果我在我的端口上修改了makefile,那么在rebase之后它就被认为是已修改的,导致整个项目需要重新构建。PS:即使它刚刚被构建过。 - Андрей Вахрушев
1
嗯,看起来你确实需要使用时间戳来完成那件事。我有一个纯粹基于Git的解决方法:在另一个仓库克隆中进行合并/变基,然后只需检出它 - 它将仅更新真正发生更改的文件。对于其他解决方案,我可能需要了解一些关于你的环境的信息,比如它是Linux吗? - Frax
1
我写了自己的答案,但是这里的答案(https://dev59.com/L3A75IYBdhLWcg3wOWVd#3418577 和 http://stackoverflow.com/a/23298203/2468549)似乎有更完整的解决方案。 - Frax
1个回答

1
在写了自己的答案后,我发现有两个类似的问题有很好的答案这里这里。它们提供用于保存和恢复文件时间戳的 Python 脚本。
以下是我的解决方案。我决定保留它,因为它非常简单——只是一个 bash 一行命令。
它不是完整的解决方法,因为它是一种将所有未更改的文件的时间戳更改为某个请求时间而不是它们之前的修改日期的方法,但对于大多数情况来说应该已经足够了。然而,有时候这可能是不安全的——如果您的构建不是最新的,那么可能会防止它进行更新(如果不清楚,请询问)。
您可以使用以下命令列出所有未更改的文件。
 git ls-files | grep -Fv '$\n'"$(git diff HEAD@{1} --name-only)"

替换 HEAD@{1} 为你实际需要的提交

这个 '$\n' 有点奇怪——它是一个Hack,以确保即使没有更改文件,它仍然能够工作,因此并不是非常重要。

要更改所有文件的修改日期,请使用

touch -chmd "2015-03-24" $(git ls-files | grep -Fv '$\n'"$(git diff HEAD@{1} --name-only)")

(将HEAD@ {1} "2015-03-24"替换为您想要的提交和日期)

注意文件名中的空格-它们不会起作用,可能会导致意外触碰其他文件。设置IFS ='$ \ n'应该可以解决这个问题。


我添加了答案链接。 - Frax

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接