在java8中,可以使用例如访问类java.lang.reflect.Fields的字段。
Field.class.getDeclaredFields();
Run Code Online (Sandbox Code Playgroud)
在java12中(从java9开始),这仅返回一个空数组。即使有
--add-opens java.base/java.lang.reflect=ALL-UNNAMED
Run Code Online (Sandbox Code Playgroud)
组。
任何想法如何实现这一目标?(Appart认为这可能不是一个好主意,我希望能够通过反射在junit测试期间更改代码中的“ static final”字段。Java8可以通过更改“修饰符”来实现。
Field modifiersField = Field.class.getDeclaredField("modifiers");
modifiersField.setAccessible(true);
modifiersField.setInt(myfield, myfield.getModifiers() & ~Modifier.FINAL);
Run Code Online (Sandbox Code Playgroud)
)
虽然像"git log"这样的命令会很乐意接受同一参考的不同表达式,例如
refs/heads/master
heads/master
master
Run Code Online (Sandbox Code Playgroud)
对于"git update-ref",情况并非如此.例如
git update-ref master HEAD^
Run Code Online (Sandbox Code Playgroud)
是不一样的
git update-ref refs/heads/master HEAD^
Run Code Online (Sandbox Code Playgroud)
第一个命令创建一个新的ref .git/master(反过来引入了关于refs/heads/master的歧义).只有第二个命令真正更新了主人的脑袋.(git的/参/头/主)
为什么git update-ref接受没有"refs /"前缀的引用?是否应该至少有警告或命令行选项来强制创建此类引用?
我花了很长时间才弄明白为什么
git update-ref master HEAD^
Run Code Online (Sandbox Code Playgroud)
没有按预期工作.
我需要自动化交互式rebase或用其他命令替换它.让我解释一下我目前的情况:
在svn-> git转换中,我需要重新绑定新创建的git存储库以修复SVN期间的"历史截止".这是我的手动工作流程来解决问题.
branchNEW: containing history from SOMEDAY until now
branchOLD: containing history from past to SOMEDAY
Run Code Online (Sandbox Code Playgroud)
编辑或ascii:
branchNEW: Y - Z
branchOLD: W - X
Run Code Online (Sandbox Code Playgroud)
两个分支都没有共同的提交.
现在的基本想法是将branchNEW重新绑定到branchOLD.不幸的是有一些重构SOMEDAY:一些文件被移动到另一个目录.现在,rebase的结果是每个移动的文件都存在于两个地方.
编辑
some file exist in X
the (nearly) same files also exist in Y, just on another path
branchNEW: W - X - Y - Z
(after rebase)
Run Code Online (Sandbox Code Playgroud)
在rebase之后,HEAD现在包含X和Y的文件.我还尝试向branchOLD添加新的提交,删除旧文件.在rebase SVN-HEAD和git-HEAD二进制相同之后,"git log --follow"不起作用.
现在主要问题是:我能够通过使用第二个交互式rebase来解决这个问题:
git rebase -i SHA
Run Code Online (Sandbox Code Playgroud)
SHA是branchNEW中旧的 root提交的sha-id .现在在编辑器中,我必须将"选择"更改为"编辑"以进行最顶层的提交.退出编辑器后,我现在必须删除错误的文件
git rm -f fileA fileB
git commit --amend
git rebase …Run Code Online (Sandbox Code Playgroud) 鉴于历史
X-Y <- feature
/
A-B-C-D-E <- master
Run Code Online (Sandbox Code Playgroud)
我想得到一个给定提交的后代.一个解决方案似乎是:
git log --all --ancestry-path <ref>^!
Run Code Online (Sandbox Code Playgroud)
但是,这种行为有点奇怪:
<rev>是C时,结果是CDEXY<rev>是D或X,结果是DEXY(奇怪!)<rev>是E时,结果是E我的理解是命令并没有让所有的孩子都得到<rev>; 相反,它获得父(-ref)的所有孩子.我对吗?
这是不直观的,容易出错,坦率地说,令人恼火.我应该如何运行命令,以便将日志限制为给定提交的后代.
我正在尝试将每个具有不同根提交的两个分支组合成一个新的空分支.这不是通常的合并事情,因为我不希望仅在最后一次提交中将分支组合在一起(在这种情况下,新分支将具有合并提交,并且"下方"仍然是两个单独的历史.新分支仍将是有两个root提交.)
我的场景中的一个重要事实是两个分支完全不相关.任何一个分支的提交都不影响其他分支的提交的路径=>不存在冲突.
我们假设以下分支:
A---B-----C-D
X---Y-Z
Run Code Online (Sandbox Code Playgroud)
这就是我要找的:
A-X-B-Y-Z-C-D
Run Code Online (Sandbox Code Playgroud)
重点是我希望按时间顺序进行提交.怎么实现?
如果您查看文档(例如http://www.oracle.com/technetwork/java/javase/tech/vmoptions-jsp-140102.html),您会发现XX的默认值为8:SurvivorRatio.
如果你在没有明确设置SurvivorRation的情况下检查一个已经启动的jvm,你可以看到这个默认值:
jmap -heap <pid>
Run Code Online (Sandbox Code Playgroud)
将输出
...
SurvivorRatio = 8
...
Run Code Online (Sandbox Code Playgroud)
但是如果使用VisualGC检查S1 S0的最大大小,则可以看到使用了SurvivorRatio = 1.
如果你明确地启动java程序-XX:SurvivorRatio = 8,图像会改变
那么为什么默认.没有使用的默认是非常恼人的.
我想知道在以下示例中是否可以减少最后四行:
#!/bin/bash
function xxx {
echo $#
echo $1
}
[[ -n $SOME_ENV ]] && P="-Dabc=$SOME_ENV"
if [[ -n $P ]]; then
xxx "$P" abc
else
xxx abc
fi
Run Code Online (Sandbox Code Playgroud)
用just替换if-else-fi
xxx "$P" abc
Run Code Online (Sandbox Code Playgroud)
如果$ P不为空,则可以正常工作,否则不会因为""仍然算作空参数.如果SOME_ENV包含空格,则省略$ P周围的引号不起作用.我知道这可能是"eval",但eval是邪恶的:http://mywiki.wooledge.org/BashFAQ/048
还有其他方法吗?
git ×4
java ×2
bash ×1
branch ×1
eval ×1
git-log ×1
interactive ×1
java-12 ×1
jvm ×1
merge ×1
rebase ×1
reference ×1
reflection ×1
unit-testing ×1