我犯了最笨拙的错误。当我在文本编辑器中突出显示迁移文件的名称时,我的手指滑了,我删除了该迁移文件。模式已经具有迁移文件的表模式,但如何还原刚刚删除的文件?我找到了这个SO帖子,但它没有帮助我。
我一直在做一些工作,所以我没有提交,也无法通过版本控制回收丢失的文件。
答案 0 :(得分:0)
好的,这解决了我的问题。我在终端写了String replace_src =
"{String str_obj = this;\n"
+ "char[] str = this.value;\n"
+ "String find_obj = $1.toString();\n"
+ "char[] find = find_obj.value;\n"
+ "String repl_obj = $2.toString();\n"
+ "char[] repl = repl_obj.value;\n"
+ "\n"
+ "if(str.length == 0 || find.length == 0 || find.length > str.length) {\n"
+ " return str_obj;\n"
+ "}\n"
+ "int start = 0;\n"
+ "int end = str_obj.indexOf(find_obj, start);\n"
+ "if(end == -1) {\n"
+ " return str_obj;\n"
+ "}\n"
+ "int inc = repl.length - find.length;\n"
+ "int inc2 = str.length / find.length / 512;\ninc2 = ((inc2 < 16) ? 16 : inc);\n"
+ "int sb_len = str.length + ((inc < 0) ? 0 : (inc * inc2));\n"
+ "StringBuilder sb = (sb_len < 0) ? new StringBuilder(str.length) : new StringBuilder(sb_len);\n"
+ "while(end != -1) {\n"
+ " sb.append(str, start, end - start);\n"
+ " sb.append(repl);\n"
+ " start = end + find.length;\n"
+ " end = str_obj.indexOf(find_obj, start);\n"
+ "}\n"
+ "if(start != str.length) {\n"
+ " sb.append(str, start, str.length - start);\n"
+ "}\n"
+ "return sb.toString();\n"
+"}";
ClassPool cp = new ClassPool(true);
CtClass clz = cp.get("java.lang.String");
CtClass charseq = cp.get("java.lang.CharSequence");
clz.getDeclaredMethod("replace", new CtClass[] {
charseq, charseq
}).setBody(replace_src);
instrumentationInstance.redefineClasses(new ClassDefinition(Class.forName(clz.getName(), false, null), clz.toBytecode()));
,其中打印了我删除的文件的名称:20151014152222_create_post_categories.rb
我刚刚使用适当的迁移代码重新创建了此文件。最初我想将表重命名为posts_categories,因此在运行git diff
之后,我运行了rake db migrate
,将文件和第一个参数重命名为create_table,其中包含:posts_categories。
然后我再次运行迁移。这显然带回了丢失的文件并正确编辑了我的架构。